假设我有以下模型:
Group
has_many :users
User
belongs_to :group
我有以下表格:
User_id Group
-------------------------------------
1 Police
2 Fire
3 Military
4 Police
5 Police
1 Fire
大多数用户属于单个群组,但某些用户(如user_id: 1
)属于多个群组。 (他属于Police
和Fire
。
我的问题是:如果我获得了两个user_id's
,(比如1
和2
),我将如何查询找出这两个用户所属的公共组(例如,在上面的情况下,查询将返回Fire
。
希望这是有道理的。
答案 0 :(得分:0)
首先,我建议在用户和群组之间使用has_and_belongs_to_many关系:
class Group
has_and_belongs_to_many :users
end
class User
has_and_belongs_to_many :users
end
您有以下表格:
create_table "groups", force: true do |t|
t.string name
end
create_table "users", force: true do |t|
...
end
create_table "groups_users", id: false, force: true do |t|
t.integer "group_id"
t.integer "user_id"
end
这可以防止您当前在groups表的group字段中重复。它还有助于避免某些数据输入错误(拼写错误)并使构建更好的UI更容易。还有其他方法可以克服这些相同的障碍,但它们比通常不遵守惯例所节省的费用要多得多。
然后,您可以获得两个用户(user_a和user_b)的组的交集,如:
user_a.groups & user_b.groups # => an array of the groups that they both belong to
(user_a.groups & user_b.groups).collect(&:name) # => an array of the names of the groups they both belong to.
答案 1 :(得分:0)
这实际上取决于您如何建立关联,但这是在一个查询中进行关联的一种方法
user_a.groups.where(id: user_b.groups.select(:id))