0

我正在使用多态关联来论证我的Post模型(它具有常见的帖子属性 - 标题、正文、日期等......)

这是我的模型,

class Post < ActiveRecord::Base
  belongs_to :post_module, polymorphic: true
end

class Album < ActiveRecord::Base
  has_one :post, as: :post_module
  belongs_to :artist
end

class Artist < ActiveRecord::Base
  has_many :albums
end

现在我有一个Post模型,其Album模型为:post_module

@post = Post.find(params[:id]) #its :post_module is an Album model

现在我想查询Post具有与该帖子的专辑艺术家 ID 相同的艺术家 ID 的专辑模型的 s。


我可以查询Album与该专辑具有相同艺术家 ID 的模型@post……但这不是我想要的……

我想要一套Post

@albums = Album.where('albums.artist_id = "?"', @post.post_module.artist.id)

我怎样才能做到这一点?还是我在设计一个糟糕的模型关系?

4

3 回答 3

0

艺术家的帖子

artist = Artist.last

#This will get a scoped object for all posts belonging to this artist's albums
posts = Post.where(id: artist.albums) 

对于您的模型设计,有两个建议:

  1. 如果只有 Album 将与 Post 关联,则不需要多态,尽管我猜你可能有更多。
  2. 对于多态名称,约定是使用 adj,postable而不是post_module
于 2013-09-27T10:25:24.590 回答
0

如果我理解正确,您想检索给定艺术家 ID 的所有帖子。所以:

@posts = Post.joins(:post_module => :album).where(:post_module => { :album => { :artist_id => artist_id }})
于 2013-09-27T10:54:26.703 回答
0

我结束了

Post.joins('LEFT OUTER JOIN albums ON albums.id = posts.post_module_id').where('posts.post_module_type = "Album" AND albums.artist_id = "?"', @artist.id)

于 2013-10-05T02:11:18.370 回答