Ruby on Rails使用一个模型的多个关系角色

时间:2014-12-01 08:32:50

标签: ruby-on-rails ruby relationship role

组:

  • 创建者

  • 管理员

  • 成员

  • 播放列表

每个创建者/管理员/成员都是用户。 我需要能够从每个用户调用这些:

  • User.mygroups(我是创作者的群组)

  • User.controlledgroups(我是管理员的群组)

  • User.joinedgroups(我所属的群组)

我怎样才能做到这一点? 我知道我可以做这样的事情。它将如何来自用户方?

class Group < ActiveRecord::Base
    has_one :creator, :class :user
    has_many :admins, :class :user
    has_many :memebers, :class :user
end

2 个答案:

答案 0 :(得分:2)

用户模型中的

class User < ActiveRecord::Base
  has_many :my_groups,
        :class_name => "Group",
        :foreign_key => :creator_id
  has_and_belongs_to_many :controlled_groups,
        :class_name => "Group",
        :join_table => :admins_groups
  has_and_belongs_to_many :joined_groups,
        :class_name => "Group",
        :join_table => :groups_members
end
组模型中的

class Group < ActiveRecord::Base
    belongs_to :creator, :class_name => "User"
    has_and_belongs_to_many :admins,
           :class_name => "User",
           :join_table => :admins_groups
    has_and_belongs_to_many :members,
           :class_name => "User",
           :join_table => :groups_members
end

移植

# migration to create join table for admins and groups
def change
   create_table :admins_groups, :id => false do |t|
      t.integer :user_id
      t.integer :group_id
   end
end

# migration to create join table for members and groups
def change
   create_table :groups_members, :id => false do |t|
      t.integer :user_id
      t.integer :group_id
   end
end
# in migration where you create groups table
def change
   create_table :groups do |t|
      # ....  all other fields
      t.integer :creator_id # id for group creator
      t.timestamps
   end
end

答案 1 :(得分:1)

对于每个has_many,您需要在User类中使用belongs_to。 然后,您可以为User._要求提供scopes或类方法。

喜欢:

class User < ..
  scope :mygroups, ->{ where(:id => "Group.creator_id") }
  scope :controlledgroups, ->{ where(:id => "Group.admin_id") }
end

还有其他方法可以根据您喜欢的方式编写查询,如果您在User中有一个布尔字段说admin: true那么它会有所不同。 但是你需要指定外键,如

has_many :admins, class_name: "User", foreign_key: "admin_id"