【发布时间】:2015-05-12 10:40:47
【问题描述】:
我对 Rails 还很陌生,所以如果我在我的问题上遗漏了一些明显的东西,请原谅我。我当前的项目涉及能够发布、删除、喜欢和不喜欢书签的用户。在用户的个人资料页面上,有一个用户发布的书签列表,以及另一个他们喜欢的书签列表。我一直在尝试建立一个更优雅的解决方案来收集“喜欢的书签”,而不是像下面的代码那样使用 .pluck。
# 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 through 关系,如下所示:
# 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
这对我来说很有意义,但是我无法让它发挥作用(liked_bookmarks 未被识别为一种方法)并且我无法发现我错过了什么。
我启动 rails 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 through 关系时...
# 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)
检查以上两行返回的对象后,它们都只返回喜欢的书签。
# The 'likes' table contains:
t.integer "user_id"
t.integer "bookmark_id"
我想返回正确数量的对象,就像在我的原始代码中一样,通过使用 like_bookmarks 指定的 has_many 关系。谁能让我知道我错过了什么?我是不是走错路了?
我正在使用 Rails 4.1.8 和 ruby 2.1.2p95
【问题讨论】:
标签: ruby-on-rails ruby activerecord