我仍然相当擅长使用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通过关系,如下:
# 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
这对我来说很有意义,但我不能让它工作( likes_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通过关系......
# 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"
我想使用likes_bookmarks指定使用has_many through关系返回正确数量的对象,就像我的原始代码一样。任何人都可以让我知道我失踪的是什么吗?我是否以错误的方式处理这个问题?
我使用Rails 4.1.8和ruby 2.1.2p95
答案 0 :(得分: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
的来源的详细信息