Я по-прежнему довольно новичок в рельсах, поэтому простите меня, если мне не хватает чего-то очевидного в моей проблеме. В моем текущем проекте участвуют пользователи, которые могут размещать, удалять, использовать и отличать закладки. На странице профиля пользователя есть список закладок, которые опубликовал пользователь, и другой список закладок, которые им понравились. Я пытаюсь создать более элегантное решение для сбора «любимых закладок» вместо использования .pluck, как в приведенном ниже коде.Невозможно получить has_many через правильную работу - неверный подсчет объектов возвращен
# inside users_controller.rb
def show
@user_bookmarks = current_user.bookmarks.all
@liked_bookmarks = Bookmark.where(id: current_user.likes.pluck(:bookmark_id))
end
Соотношения для каждой модели:
# inside user.rb
has_many :bookmarks
has_many :likes, dependent: :destroy
# inside bookmark.rb
belongs_to :user
has_many :likes, dependent: :destroy
# inside like.rb
belongs_to :user
belongs_to :bookmark
я получил предложение, чтобы вместо того, чтобы установить его как has_many через отношения, например, так:
# inside user.rb
has_many :bookmarks
has_many :likes, dependent: :destroy
has_many :bookmarks, through: :likes, as: :liked_bookmarks
# inside users_controller.rb
def show
@user_bookmarks = current_user.bookmarks.all
@liked_bookmarks = current_user.liked_bookmarks.all
end
Который имеет смысл для меня, однако я не могу заставить это работать (понравилось_книги не распознано как метод), и я не могу обнаружить, что это такое, чего я не хватает.
Я включил рельсы c, чтобы попытаться понять проблему, и сбрось мою модель пользователя и контроллер к исходному коду. Когда я печатаю следующее я получить правильные результаты, основанный на моих записях базы данных:
user = User.first
user.bookmarks.count # returns 4 (correct)
user.bookmarks.where(id: user.likes.pluck(:bookmark_id)).count # returns 2 (correct)
Однако, когда я обозначаю это в has_many через отношения ...
# user.rb
has_many :bookmarks
has_many :likes, dependent: :destroy
has_many :bookmarks, through: :likes # <-- liked_bookmarks still failed, so I removed it just for curiousity
... вот что одни и те же команды возвращают в настоящее время:
user = User.first
user.bookmarks.count # returns 2 (incorrect)
user.bookmarks.where(id: user.likes.pluck(:bookmark_id)).count # returns 2 (correct)
После изучения объектов, возвращаемых в указанных выше 2 линии, они как только возвращение bookm arks, которые .
# The 'likes' table contains:
t.integer "user_id"
t.integer "bookmark_id"
Я хотел бы вернуть правильное количество объектов, как в моем исходном коде с has_many через отношения, используя обозначение liked_bookmarks. Может ли кто-нибудь сообщить мне, что мне не хватает? Разве я поступил неправильно?
Я использую Rails 4.1.8 и рубин 2.1.2p95
отлично работает! Спасибо @AbM! Оглядываясь назад, у меня тоже была своя логика назад, это многое объясняет мне. – joeybuczek