ActiveRecord,double belongs_to

我有2个型号: LinkUser如:

 class Link < ActiveRecord::Base belongs_to :src_user belongs_to :dst_user end class User < ActiveRecord::Base has_many :links end 

架构可能看起来像:

 +----------+ +------+ | Link | | User | +----------+ |------+ | src_user |---->| | | dst_user |---->| | +----------+ +------+ 

我的问题是: 如何编辑User模型才能执行此操作

 @user.links # => [list of links] 

(…如果可能的话,应该查询@ user.src_users + @ users.dst_users,以及unicity。)

我们能在ActiveRecord中使用SQL吗? 非常感谢。

(注意:我在Rails 3.1.1上)

您必须在用户模型中指定多个关系,以便它知道它将附加到哪个特定关联。

 class Link < ActiveRecord::Base belongs_to :src_user, class_name: 'User' belongs_to :dst_user, class_name: 'User' end class User < ActiveRecord::Base has_many :src_links, class_name: 'Link', inverse_of: :src_user has_many :dst_links, class_name: 'Link', inverse_of: :dst_user end 

必须指定:class_name选项,因为关联名称不仅仅是:links。 您可能还需要在链接模型中指定:inverse_of选项,但我无法确定。 不过,如果你这样做,也不会受到伤害。

要进行@ user.links调用,您必须执行以下操作:

 class User < ActiveRecord::Base def links Link.where(['src_user = ? OR dst_user = ?', self.id, self.id]) end end 

...因为ActiveRecord没有提供将同一模型上的两个关联合并为一个的方法。

这听起来非常类似于儿童/母亲/父亲问题,这有一个解决方案。 也就是说,一种类型的对象属于同一类型的多个对象(不一定与子类型相同,但它所属的对象本身是相同类型)的问题。

这个解决方案很老了,可能与Rails3中的最新样式方案不一致,但它应该可以正常工作,或者只需很少的修改。 http://railsforum.com/viewtopic.php?id=1248