如何从rails中的两个来源建立一对多的关系?

时间:2015-07-14 05:13:25

标签: ruby-on-rails model-associations

我有Artist模型,其中有许多Reviews。此外,Artists还有许多Gigs,而reviews也有很多Artist。对于Gigs以及Artist所做的Artist.first.reviews # Should return reviews directly from the artist as well as from artist.gigs ,我们可以进行审核。我希望能够做到这样的事情:

all_reviews

我该如何建模?我应该在我的模型中定义一个新的方法,例如reviews来获取和合并app.listen(PORT_NUMBER,'localhost',function(){ console.log('server started on '+PORT_NUMBER); }) ,还是通过关联有任何直接的方式?

2 个答案:

答案 0 :(得分:2)

多态关联可帮助您解决此问题。请参阅the guide

在您的情况下,代码如下:

Class Artist
  has_many :reviews, as: reviewable
  has_many :gigs

  def all_reviews
    reviews + gigs.reviews
  end
end

Class Gig
  has_many :reviews, as: reviewable
  belongs_to :artist
end

Class Reviewable
  belongs_to :reviewable, polymorphic: true
end

你也可以将方法all_reviews作为一个关联,但主要是你打算使用关联方法(添加到集合,通过子节点查找等),而不仅仅是获取数据。

答案 1 :(得分:1)

我肯定会使用all_reviews方法。话虽如此,如何对其进行优化很有意思。

您使用的是多态字段还是Review模型belongs_to :gigbelongs_to :artist

如果案例是第二个案例,您可以在Review模型中执行以下操作:

def all_reviews
  Review.where(['reviews.gig_id IN ? OR reviews.artist_id = ?', gigs, id])
end

这应该没问题,但是如果你使用的是多态字段,让我们称它为reviewer,你可以这样做:

def all_reviews
  Review.where([
    '(reviews.reviewer_type = ? AND reviews.reviwer_id IN ?) OR (reviews.reviewer_type = ? AND reviews.review_id = ?)',
    'Gig', gigs, 'Artist', id
  ])
end

两者都应该没问题。请注意我没有手动测试代码,因此可能存在错误