2015-05-12 3 views
0

Я по-прежнему довольно новичок в рельсах, поэтому простите меня, если мне не хватает чего-то очевидного в моей проблеме. В моем текущем проекте участвуют пользователи, которые могут размещать, удалять, использовать и отличать закладки. На странице профиля пользователя есть список закладок, которые опубликовал пользователь, и другой список закладок, которые им понравились. Я пытаюсь создать более элегантное решение для сбора «любимых закладок» вместо использования .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

ответ

0

Ваш второй has_many :bookmarks, through: likes является подменяют первый has_many :bookmarks.

Чтобы устранить проблему, вместо has_many :bookmarks, through: :likes, as: :liked_bookmarks используйте:

has_many :liked_bookmarks, through: :likes, source: :bookmark

и теперь вы можете позвонить user.liked_bookmarks.count

Подробнее об источнике в этом SO answer

+0

отлично работает! Спасибо @AbM! Оглядываясь назад, у меня тоже была своя логика назад, это многое объясняет мне. – joeybuczek

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