我试图创建一组复选框标签,以便用户可以看到他们有多少(订阅了),以及没有。
我的模型是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获得所需结果的任何方式,或者我必须手动处理它,还是更改架构?
答案 0 :(得分:4)
您可以分几步完成。
首先获取所有类别
all_categories = Category.all
然后获取用户类别(我假设您已经有代码为请求定义current_user
)
@user_categories = current_user.categories
然后你可以找到两者之间的区别:
@non_user_categories = all_categories - @user_categories
@user_categories
和all_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
)