Возможно ли иметь несколько связей has_many :through
, которые проходят друг друга в Rails? Я получил предложение сделать это в качестве решения для другого вопроса, который я разместил, но не смог заставить его работать.Ruby-on-Rails: Несколько has_many: через возможно?
Друзья являются циклической ассоциацией через таблицу соединений. Цель состоит в том, чтобы создать has_many :through
для friends_comments
, поэтому я могу взять User
и сделать что-то вроде user.friends_comments
, чтобы получить все комментарии его друзей в одном запросе.
class User
has_many :friendships
has_many :friends,
:through => :friendships,
:conditions => "status = #{Friendship::FULL}"
has_many :comments
has_many :friends_comments, :through => :friends, :source => :comments
end
class Friendship < ActiveRecord::Base
belongs_to :user
belongs_to :friend, :class_name => "User", :foreign_key => "friend_id"
end
Это выглядит великолепно и имеет смысл, но не работает для меня. Это ошибка, я получаю в соответствующей части, когда я пытаюсь получить доступ к friends_comments пользователя:
ERROR: column users.user_id does not exist
: SELECT "comments".* FROM "comments" INNER JOIN "users" ON "comments".user_id = "users".id WHERE (("users".user_id = 1) AND ((status = 2)))
Когда я только ввести user.friends, который работает, это запрос он выполняет:
: SELECT "users".* FROM "users" INNER JOIN "friendships" ON "users".id = "friendships".friend_id WHERE (("friendships".user_id = 1) AND ((status = 2)))
Похоже, что он полностью забыл об исходном has_many
через отношения дружбы, а затем ненадлежащим образом пытается использовать класс User в качестве таблицы соединений.
Я делаю что-то неправильно, или это просто невозможно?
К сожалению, первоначальная цель этого подхода состояла в том, чтобы я мог получить все комментарии друзей от SQL в одном запросе. См. Здесь: http://stackoverflow.com/questions/2382642/ruby-on-rails-how-to-pull-out-most-recent-entries-from-a-limited-subset-of-a-dat Если я напишу функцию, это приведет к количеству запросов N + 1. –
Нет, не будет. Это будет 2 вопроса. Первый запрос, чтобы получить друзей и второй запрос, чтобы получить комментарии для ** всех ** друзей. Если вы уже загрузили друзей в модель пользователя, вы не понесете никаких затрат. Я обновил решение еще двумя подходами. Взглянуть. –
@williamjones У вас нет проблемы с N + 1 во всех трех подходах. Вы можете проверить свой файл журнала, чтобы убедиться в этом. Лично мне нравится подход 1, поскольку он довольно изящный, т. Е. 'User.friends.comments' лучше, чем' user.friends_comments' –