如何通过rails在没有期望外键的情况下在两个表之间建立关联?

时间:2011-12-20 22:58:38

标签: ruby-on-rails ruby-on-rails-3

鉴于以下两个模型:

User (id)
FbFriendCache(user_id,fb_user_id)

我希望能够:@ user.facebook_friends

哪个会从用户模型返回@users

我试过了:

class User < ActiveRecord::Base

  has_many :fb_friends,
    :through => :fb_friend_cache,
    :foreign_key => "fb_user_id"

但是失败了w无法找到关联。

想法?感谢

2 个答案:

答案 0 :(得分:2)

您需要先定义facebook_friends_cache关联:

has_many :facebook_friend_cache, :class_name => "FacebookFriendCache"

然后你需要在那之后定义:through关联:

has_many :fb_friends, :through => :facebook_friend_cache, :foreign_key => :user_id

这里的foreign_key必须是表示外表中User对象的id的字段,因此它必须是user_id而不是fb_user_id

我真的会给facebook_friend_cache一个更好的名字。

答案 1 :(得分:1)

我发布此答案,因为我无法在评论中提供文档摘要。 Ryan的解决方案需要进行调整。

foreign_key关联忽略has_many :through属性。您应该使用source属性。

  

:通过

     

指定执行查询的关联。   这可以是任何其他类型的关联,包括其他:通过   关联。 选项:class_name,:primary_key和:foreign_key   被忽略,因为关联使用源反射。

     

..

     

:来源

     

指定has_many使用的源关联名称   :通过查询。只有在无法从中推断出名称时才使用它   协会。 has_many:subscriber,:through =&gt; :订阅将   寻找:订阅者或订阅者订阅者,除非a   :来源。

以下解决方案应该有效:

class User < ActiveRecord::Base
  has_many :fb_friend_cache
  has_many :facebook_friends, :through => :fb_friend_cache, :source => :fb_user
end

class FbFriendCache < ActiveRecord::Base
  belongs_to :user
  belongs_to :fb_user, :class_name=>"User"
end