ActiveRecord 查询 - Rails

ActiveRecord Query - Rails

在我的 rails 应用程序中,我有一个 Book 模型和一个 User 模型。

我正在使用 acts_as_votable gem 允许对书籍模型进行投票。

在我的一个观点中,我目前正在呈现当前用户尚未投票的所有书籍的列表,然后从该列表中随机抓取一本:

@books = Book.where.not(id: current_user.find_voted_items.map(&:id))
@book = @books.sample

我现在已经使用 acts-as-taggable-on gem 为用户和书籍添加了类别。

一本书或一个用户最多可以有 9 个预定义类别(标签)selected,作为 tag_list 的一部分。

tag_list = "math, science, history, design, art, film, music, philosophy, poetry"

书籍和用户共享这些相同的 9 categories/tags。

我正在尝试检索与当前用户在他们的设置下 select 编辑的任何相似标签的所有图书的列表,排除用户已经投票的所有图书,并排除属于当前用户的所有图书 (book.user != current_user).

最后,我正在尝试 select 从该列表中随机选择一本。

我该怎么做?

类似下面的代码应该可以工作。不过,感觉很老套。

Book.tagged_with(current_user.tags, any: true).
  where.not(user: current_user).
  where.not(id: current_user.find_voted_items.map(&:id)).
  sample

如果您发现在其他地方使用了此查询的某些部分,我建议将它们提取到 class 方法中。由于您需要将当前用户作为参数传递,请注意首选方法(根据 Rails 指南)是使用 class 方法而不是范围。