2014-10-13 6 views
0

У меня есть 3 таблицы, которыеRails присоединиться на 2 таблицы

class User < ActiveRecord::Base 
    has_many :posts 
end 

class Post < ActiveRecord::Base 
    belongs_to :user 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :post 
end 

Теперь я хочу, чтобы получить все комментарии конкретного пользователя. Я попытался его с помощью find_by_sql как

Comment.find_by_sql "SELECT c.* FROM comments c, posts p, users u WHERE c.post_id = p.id and p.user_id = u.id and u.id=6" 

Это прекрасно работает. Но я хочу немного деталей из таблицы «posts» вместе с комментариями.

У кого-нибудь есть идея, как это сделать?

+0

Можете ли вы пояснить: вы говорите, что хотите получить все комментарии конкретного пользователя, но, как вы писали ранее, прямой связи между «Пользователь» и «Комментарий» нет. Другими словами, информация автора для этого комментария теряется. В конечном итоге ваш запрос извлекает все комментарии к сообщениям, которые пользователь создал, но не обязательно комментарии, которые пользователь опубликовал. Я что-то упускаю; не должно быть прямой связи между «User» и «Comment»? –

+0

У вас все в порядке. Я просто хочу получить сообщения, созданные пользователем. У меня есть связь между пользователем и комментарием через сообщение. Я чувствовал, что нет никакой необходимости иметь прямую связь между User и Comment, потому что в моем случае пользователь просто создает комментарий только для своих сообщений, он не публикует их на других сообщениях. –

+0

Gotcha, я понимаю сейчас. Извините за путаницу. Проверьте мой ответ, посмотрите, имеет ли это сейчас больше смысла. –

ответ

1

Исправленного ответ ..

Теперь, когда я правильно понял ситуацию, часть моего предыдущего ответа все еще имеет смысл с одним дополнением:

изменяющих User модели как так:

class User < ActiveRecord::Base 
    has_many :posts 
    has_many :comments, through: :posts 
end 

Этот тип отношений будет выполнять соединение между комментариями сообщений, где user_id сообщений является текущим пользователем. Вполне буквально, как вы сказали в комментариях, «связь между пользователем и комментарием [is] через Сообщение«.

Как и раньше, центром юниверса в этом сценарии является пользовательский объект. С этим дополнением, чтобы захватить все комментарии пользователя должен быть просто:

user.comments 

Если вы посмотрите на журнал, выход SQL является:

SELECT `comments`.* FROM `comments` INNER JOIN `posts` ON `comments`.`post_id` = `posts`.`id` WHERE `posts`.`user_id` = 1 

который похож на исходный запрос.

Теперь, когда вы получили комментарии для этого пользователя, вы можете просто получить доступ к данным модели Post через отношения belongs_to :post, как обычно.

В конце концов, если у вас нет особых причин для попытки сделать все в чистом SQL, этот подход более читабельный, поддерживаемый и «Rails way». Плюс это экономит много хлопот и печатания.

Дополнительная информация о has_many ... through.

+0

Привет, Пол, я считаю, что нет никакой прямой связи между пользователями и комментариями. Это только сообщения. –

+0

@ManinderReddy О, мне ужасно жаль, я неправильно понял эту часть. Читайте слишком быстро. Позвольте мне пересмотреть вопрос. –

+0

@ManinderReddy Рад это услышать. Не забудьте «принять» ответ (зеленая галочка слева от ответа). –

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