ActiveRecord,double belongs_to
我有2个型号: Link
和User
如:
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
- Rails accepted_nested_attributes计数validation
- 在Rails ActiveRecord中分配给布尔字段时如何转换值?
- rails,activerecord sum然后命令
- 错误:缺少表“self”的FROM子句条目(Rails 4 Active Record事务,postgresql 9.4))
- 如何使用活动记录在多个级别中搜索json类型的postgres
- validation以确保唯一但忽略空值?
- Rails activerecord:sum,max和join
- 是否可以根据单个对象对方法的响应对对象列表进行排序?
- 如何从ActiveRecord中的事务中排除模型?