Подтвердить что ты не робот

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.

4b9b3361

Ответ 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