ActiveRecord获取所有模型记录以及匹配某些条件的记录

时间:2017-11-22 04:06:50

标签: ruby-on-rails ruby postgresql activerecord

我试图创建一组复选框标签,以便用户可以看到他们有多少(订阅了),以及没有。

我的模型是User,Category和Preferences,用于处理两个第一个模型之间的has_many关系:

class User < ApplicationRecord
  has_many :preferences
  has_many :categories, through: :preferences
end

class Category < ApplicationRecord
  has_many :preferences
  has_many :users, through: :preferences
end

class Preference < ApplicationRecord
  belongs_to :user
  belongs_to :category
end

目标是让所有类别都存在并且能够以额外的方式检查用户是否具有这样的类别,这样我可以使用活动的CSS规则并将它们显示为与用户不具有的那些不同的规则。有。。

我已尝试获取所有类别名称,以及与用户对应的所有类别名称,并将它们作为一个内部包含多个2个元素数组的数组连接,我得到类似的内容:

[
  ["coffee",         "coffee"],
  ["coworking",      "food"],
  ["event",          "pub"],
  ["food",           "restaurant"],
  ["landmark",       "shop"],
  ["nightlife",      "vacation"],
  ["pub",            nil],
  ["restaurant",     nil],
  ["shop",           nil],
  ["transportation", nil],
  ["vacation",       nil]
]

如果我可以让它们在名称上匹配,这种方式会很好,因为每个数组都不会重复这些名称,可能就像:

[
  ["coffee",         "coffee"],
  ["coworking",      nil],
  ["event",          nil],
  ["food",           "food"],
  ["landmark",       nil],
  ["nightlife",      nil],
  ["pub",            "pub"],
  ["restaurant",     "restaurant"],
  ["shop",           "shop"],
  ["transportation", nil],
  ["vacation",       "vacation"],
]

所以我可以在数组的最后一个(第二个)元素中看到哪些是nil,并且不打印已检查元素的CSS规则。

但似乎我需要在ActiveRecord查询之外进行。

是否存在使用ActiveRecord获得所需结果的任何方式,或者我必须手动处理它,还是更改架构?

1 个答案:

答案 0 :(得分:4)

您可以分几步完成。

首先获取所有类别

all_categories = Category.all

然后获取用户类别(我假设您已经有代码为请求定义current_user

@user_categories = current_user.categories

然后你可以找到两者之间的区别:

@non_user_categories = all_categories - @user_categories

@user_categoriesall_categories严格来说不是阵列 - 它们是ActiveRecord::Relation个对象。但你仍然可以使用数组减法来找出差异。请注意,@non_user_categories 是一个实际的数组。

您可以采用另一种方式避免加载过多的记录,但对于小型数据集,性能提升将是无关紧要的。

@user_categories = current_user.categories

@non_user_categories = Category.joins(:preferences).where.not(
  "preferences.user_id = ?",
  current_user.id
)