Rails: поиск внешнего ключа без идентификатора ActiveRecord
Я хочу, чтобы ActiveRecord
выполнял поиск по столбцу non-id из таблицы.
Надеюсь, это ясно, когда я даю вам свой пример кода.
class CoachClass < ActiveRecord::Base
belongs_to :coach
end
class Coach < ActiveRecord::Base
has_many :coach_classes, :foreign_key => 'user_name'
end
Когда я делаю
coach_obj.coach_classes
, это правильно вызывает
SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = 2)
(2 является тем тренером id
здесь, что является моей проблемой.)
Я хочу, чтобы он запускал
SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = 'David')
( "Давид" является тренером user_name
)
user_name
уникален и присутствует в обеих таблицах.
По какой-то причине я не хочу иметь coach_id
в моей таблице coach_classes
.
Ответы
Ответ 1
Я думаю, вам нужно также указать параметры первичного ключа в ассоциациях:
class CoachClass < ActiveRecord::Base
belongs_to :coach, :foreign_key => 'user_name', :primary_key => 'user_name'
end
class Coach < ActiveRecord::Base
has_many :coach_classes, :foreign_key => 'user_name', :primary_key => 'user_name'
end
Указывает метод, возвращающий первичный ключ связанного объекта (по умолчанию id
).
Ответ 2
Существует опция primary_key
, которая по умолчанию установлена на :id
. Вы хотите использовать:
has_many :coach_classes, :foreign_key => :user_name, :primary_key => :user_name
Также используйте эти параметры в ассоциации belongs_to
.
Подробнее в документации.
Ответ 3
Вам нужно использовать finder_sql
:
class Coach < ActiveRecord::Base
has_many :coach_classes, :finder_sql => 'SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = "#{user_name}")'
end