我有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);
})
,还是通过关联有任何直接的方式?
答案 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 :gig
和belongs_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
两者都应该没问题。请注意我没有手动测试代码,因此可能存在错误