Rails:非id外键查找ActiveRecord

时间:2010-07-23 11:20:38

标签: ruby-on-rails activerecord foreign-key-relationship has-many belongs-to

我希望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

3 个答案:

答案 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