我希望ActiveRecord
通过表中的非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
。
答案 0 :(得分:52)
我认为您还需要在关联上指定主键选项:
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
)。
答案 1 :(得分:9)
有一个名为primary_key
的选项,默认设置为:id
。你想使用:
has_many :coach_classes, :foreign_key => :user_name, :primary_key => :user_name
还可以在belongs_to
关联中使用这些选项。
在documentation中阅读更多内容。
答案 2 :(得分:-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