无法通过正常工作获得has_many - 返回了错误的对象计数

时间:2015-05-12 02:08:09

标签: ruby-on-rails ruby activerecord

我仍然相当擅长使用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

1 个答案:

答案 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

的来源的详细信息