用不同实体模拟用户“友谊”的最佳方式?

时间:2009-08-12 19:09:19

标签: ruby-on-rails polymorphic-associations

我有以下实体:

  • 用户
  • 公司
  • 组织

用户需要能够将用户,公司,组织和未来派对对象添加到他们的朋友列表中。

我最初的想法涉及使用具有与朋友的多态关系的友谊对象,如下所示:

简化友谊架构:

  • USER_ID
  • friendable_id
  • friendable_type
User
- has_many :businesses, :through => :friendships, :conditions => ['friendable_type=?', 'Business'], :source => :friendable

我的问题是Ruby on Rails ActiveRecord不支持has_many通过连接表上的多态关系来实现关系。

最后,我希望有一个连接表能够迭代以获得所有类型,某些类型等的朋友列表,如下所示:

john = User.find(5)
john.friendships.map {|friendship| friendship.friendable }
john.businesses (has_many :through scoped to only the businesses)
john.organizations (has_many :through scoped only to the organizations)

我考虑过让用户,业务和组织从一个通用的Party类继承并使关联指向基类Party类,但是在ORM的上下文中导致一堆垃圾字段而且它只是好像很脏。

我想知道的是其他人如何处理这样的情况,你想通过使用ActiveRecord的公共连接表创建与类似对象的一对多关系,同时避免这个错误::))

Cannot have a has_many :through association 'User#businesses' on the polymorphic object 'Friendship#friendable'.

任何建议都非常感谢。

谢谢!

2 个答案:

答案 0 :(得分:0)

不要使用:通过,使用:as =>友好而不是多态的has_many关系

答案 1 :(得分:0)

似乎Rails插件'has_many_polymorphs'允许我完全按照自己的意愿行事。

http://github.com/fauna/has_many_polymorphs/tree/master

将此行添加到我的用户模型中,为我提供了我想要的功能:

has_many_polymorphs :friendables, :from => [:businesses, :organizations], :through => :friendships