Rails:非id外键查找ActiveRecord

27

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

我希望你能帮助我解决问题,这里是从stackoverflow获取的内容:(2是教练id的值,这就是我的问题所在。)

我希望它能够触发。

SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = 'David')

('David' 是该教练的 user_name)

user_name 在两个表中都是唯一的。

出于某些原因,我不想在我的 coach_classes 表中有一个 coach_id


1
不经请求的建议:您可能需要考虑在表中添加一个coach_id,如果这种关系变得嵌套和更加传统,它会使事情变得更容易。 - Jed Schneider
谢谢Jed。但出于某种原因,我不想在那里放coach_id。 - Garfield
3个回答

55

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

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


约翰,你确定关联的另一侧对这里有影响吗?一个简单地使用has_many,而没有在另一侧使用belongs_to - alex.zherdev
我在互联网上搜寻了这个答案。谢谢! - Jake Catron

10

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

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

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

文档中详细阅读。


-6

你需要使用finder_sql

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

注意 - 在后续版本中,他们取消了这个功能。当他们的“魔法”没有你需要的功能时,它真的是一个救命稻草。 - JosephK
绝对不要这样做...永远不要。 - jeffci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接