Rails - ActiveRecord - 基于共性查找公共组

时间:2014-02-10 23:38:31

标签: ruby-on-rails activerecord

假设我有以下模型:

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)属于多个群组。 (他属于PoliceFire

我的问题是:如果我获得了两个user_id's,(比如12),我将如何查询找出这两个用户所属的公共组(例如,在上面的情况下,查询将返回Fire

希望这是有道理的。

2 个答案:

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