如何查询多态has_one关联的属性?

时间:2013-09-27 08:40:05

标签: sql ruby-on-rails activerecord

我正在使用多态关联来论证我的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。


我可以使用该Album专辑的相同艺术家ID查询@post个模型...但这不是我想要的......

我想要一套Post

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

我该怎么做?还是我设计了一个糟糕的模特关系?

3 个答案:

答案 0 :(得分: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. 如果只有专辑会与Post关联,不需要多态,但我想你可能会有更多。
  2. 对于多态名称,惯例是使用adj,postable而不是post_module

答案 1 :(得分:0)

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

@posts = Post.joins(:post_module => :album).where(:post_module => { :album => { :artist_id => artist_id }})

答案 2 :(得分: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)