2014-02-26 53 views
0

我有以下情况,用户可以创建新闻快递,也可以订阅新闻快递。有没有更好的方法来区分这两种能力与关联,或者我可以将所有权置于订阅模式中,如multiple has_many associations in Rails所示。有了这个解决方案,我该如何编写新闻稿模型以获得新闻通讯所有者和新闻通讯订阅者。Rails关联 - 多种模型能力

Newsletter Model 
    # fields: id, user_id 
    has_many :subscriptions 
    has_many :users, through: :subscriptions 
    belongs_to :user *i.e. created by a single user* 

Subscription Model 
    # fields: user_id, newsletter_id 
    belongs_to :newsletter 
    belongs_to :user 

User Model 
    # fields: id 
    has_many :subscriptions 
    has_many :newsletters, through: :subscriptions 
    has_many :newsletters *i.e. created many newsletters* 
    has_many :created_newsletters, :through => :subscriptions, *old answer* 
      :source => :newsletter, 
      :conditions => ["newsletter.creator = ?", true] 

回答

2
Newsletter Model 
    has_many :subscriptions 
    has_many :subscribers, through: :subscriptions, source: :user 
    belongs_to :creator, class_name: "User", foreign_key: "user_id" 

Subscription Model 
    # fields: user_id, newsletter_id 
    belongs_to :newsletter 
    belongs_to :user 

User Model 
    # fields: id 
    has_many :subscriptions 
    has_many :subscribed_newsletters, through: :subscriptions, source: :newsletter 
    has_many :created_newsletters, class_name: "Newsletter", foreign_key: "user_id" 

现在,你可以通过做

newsletter.subscribers 
newsletter.creator 
+0

是否也可以说user.newsletters和user.newsletter得到用户和创造者? –

+0

是的,如果这就是你想要的。但它的轨道约定有has_many协会作为复数 – usha

+0

谢谢!顺便说一下,在这种形式下,新的“creator”/“subscribed_newsletters”模型的技术名称是什么?即我可以在多个模型中使用相同的名称除了feed.creator的“belongs_to:creator,class_name:”Feed“,foreign_key::user_id”“以及newsletter.creator? –