2016-06-28 8 views
0

Я не могу понять, как получить все связанные записи, используя ассоциации, а не связанные с ними идентификаторы, такие как user_id и comment_id. Давайте предположим, что у меня есть три модели User, Post, Comment, Image и ассоциацииПолучить все связанные записи, используя ассоциации

User 
    has_many :posts 
    has_many :comments 

Post 
    belongs_to :user 
    has_many :comments 
    has_many :images 

Comment 
    belongs_to :user 
    belongs_to :post 

Image 
    belongs_to :post 

Теперь у меня есть user_id пользователя и найти пользователя как:

@user = User.find_by_id(params[:id]) 
@comments = @user.comments 

теперь я хотел бы принести эти замечания с каждым из них в связанные с их записью. Мне нужен пост хеш вместо post_id, соответствующий каждому комментарию. Я хочу сделать это в одном запросе. Если у вас есть какие-либо идеи, пожалуйста, предложите мне.

+0

Try '@ user.comments.first.post', он будет возвращать экземпляр' Post'. Остерегайтесь проблемы ["N + 1 query'] (https://www.sitepoint.com/silver-bullet-n1-problem/) в рамках этого подхода, который должен быть разрешен, но это выходит за рамки вашего вопроса. – mudasobwa

+0

Спасибо за ваше внимание @mudasobwa. Но мой вопрос в том, что я хочу, чтобы в коллекции комментариев уже была запись сообщений, соответствующая каждому комментарию, а не post_id. Я не хочу создавать петлю, чтобы получить сообщение каждого из них. –

ответ

2

Использование includes(:association):

@user = User.find_by_id(params[:id]) 
@comments = @user.comments.includes(:post) 

ПРИМЕЧАНИЕ: Это будет сделать еще один (второй) запрос.

В качестве альтернативы, включить его в свой первоначальный запрос:

@user = User.where(id: params[:id]).includes(comments: :post) 
+0

Извините @Uzbekjon, это приведет к тому, что ошибка ассоциации с именем «posts» не была найдена в комментариях. –

+0

Это опечатка. Просто измените его на 'post', так как это ассоциация' own_to'. – Uzbekjon

+0

okay @Uzbekjon. Это не заменит post_id из коллекции комментариев. Это вернет post_id снова, а не полный пост hash –

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