2013-09-27 4 views
0

Я использую полиморфной ассоциации аргументировать свою Post модель (которая имеет общую запись атрибутов-заголовок, тело, дата, и т.д. ...)как запросить с помощью полиморфного атрибута has_one ассоциации?

Вот мои модели,

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 S, который имеет модель альбома с таким же художником идентификатором этого позы id.


Я могу запросить Album модели с таким же художником идентификатором альбома, который @post «s ... но это не то, что я хочу ..

Я хочу набор Post

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

Как я могу это сделать? или я разрабатываю плохие отношения модели?

ответ

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)

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. Для полиморфного имя, соглашение заключается в использовании прил, postable вместо post_module
0

Если я правильно понял, вы хотите получить все сообщения для данного художника ид. Итак:

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

это не работает с ошибкой с NameError: неинициализированная постоянная Post :: PostModule – synthresin

Смежные вопросы