Rails:非id外键查找ActiveRecord

我希望ActiveRecord通过表中的非id列进行查找。 当我向你提供我的代码示例时,希望这很清楚。

 class CoachClass < ActiveRecord::Base belongs_to :coach end class Coach  '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') 

(’David’是那个教练的user_name

user_name是唯一的,并且存在于两个表中。

出于某种原因,我不希望在coach_classes表中有一个coach_id

我认为您还需要在关联上指定主键选项:

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

有一个名为primary_key的选项,默认情况下设置为:id 。 你想用:

 has_many :coach_classes, :foreign_key => :user_name, :primary_key => :user_name 

还可以在belongs_to关联上使用这些选项。

阅读文档中的更多内容 。

你需要使用finder_sql

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