23

Я хочу ActiveRecord для поиска по столбцу non-id из таблицы. Надеюсь, что это ясно, когда я даю вам мой пример кода.Рельсы: поиск внешнего ключа без идентификатора ActiveRecord

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 по какой-то причине.

+0

незапрашиваемый совет: вы можете подумать о добавлении coach_id в таблицу, это упростит, если это отношение станет вложенным и более обычным. –

+0

Спасибо, Jed. Но мне почему-то не нужен coach_id. – Garfield

ответ

51

Я думаю, вам нужно указать основные ключевые параметры на ассоциациях, а также:

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).

+0

Джон, ты уверен, что здесь действует другая сторона ассоциации? Можно просто иметь 'has_many', без' own_to' с другой стороны. –

+0

@neutrino Я отредактировал свой ответ. –

+0

Спасибо, Джон! Теперь гораздо яснее, как он смотрит вверх. – Garfield

-4

Вы должны использовать finder_sql:

class Coach < ActiveRecord::Base 
    has_many :coach_classes, :finder_sql => 'SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = "#{user_name}")' 
end 
+0

Примечание - они убрали это в более поздних версиях. На самом деле спасатель, когда их «магия» не обладает необходимой функциональностью. – JosephK

9

Существует вариант называется primary_key, который по умолчанию установлен в :id. Вы хотите использовать:

использовать Также эти параметры на belongs_to ассоциации.

Подробнее в documentation.

Смежные вопросы