Rails - 与组,用户,所有者,成员关联有困难

时间:2016-03-09 01:56:54

标签: mysql ruby-on-rails ruby-on-rails-4 activerecord associations

我到处寻找并且无法找到我正在寻找的确切内容。我知道我需要什么,但我无法将2和2放在一起。

  • 我需要允许用户创建群组并允许其他用户加入群组。
  • 任何用户都可以创建一个组。
  • 任何用户都可以发送加入其他群组的请求。
  • 用户只能创建一个组,但可以属于多个组。
  • 该组的创建者是该组的所有者。
  • 所有成员和所有者都是普通用户,没有特殊权限。
  • 群组创建者/所有者可以添加/删除其他群组成员。

这段代码不合适,但这就是这个想法:

class Group < ActiveRecord::Base
 has_one :owner, :class_name => "user"
 has_many :members, :class_name => "user"
end

class User < ActiveRecord::Base
 belongs_to :groups
 has_one :group, :class_name "user"
end

我相信我需要一个has_many:通过关联,但我不确定如何实现它。如何构建模型/控制器/迁移以表示上述参数中的关联?

3 个答案:

答案 0 :(得分:1)

Modern Rails应用程序使用has_many through:而不是HABTM。

class User < ActiveRecord::Base

  has_many :groups, through: :user_groups

end

class Group < ActiveRecord::Base

  has_one  :owner, through: :user_groups, source: :user
  has_many :members, through: :user_groups, source: :user

end

class UserGroups < ActiveRecord::Base
  validates :owner, uniqueness: true
  belongs_to :member, class_name: 'User'
  belongs_to :group
  belongs_to :owner, class_name: 'User'
end

sourcehas_many上添加has_one,您可以撰写Group.find(id).membersGroup.find(id).owner。验证联接中组所有者的唯一性。

答案 1 :(得分:1)

我建议使用如下的连接表:

class Membership < ActiveRecord::Base
  belongs_to :group
  belongs_to :user
end

class Group < ActiveRecord::Base
  belongs_to :owner, class_name: "User"
  has_many :members, through: :memberships, source: :user
  has_many :memberships
end

class User < ActiveRecord::Base
  has_one :owned_group, foreign_key: "owner_id", class_name: "Group"
  has_many :groups, through: :memberships
  has_many :memberships
end

迁移如下:

class CreateMemberships < ActiveRecord::Migration
  def change
    create_table :memberships do |t|
      t.references :user
      t.references :group

      t.timestamps null: false
    end
  end
end

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.timestamps null: false
    end
  end
end

class CreateGroups < ActiveRecord::Migration
  def change
    create_table :groups do |t|
      t.references :owner

      t.timestamps null: false
    end
  end
end

schema design

答案 2 :(得分:0)

http://guides.rubyonrails.org/association_basics.html#the-types-of-associations

在这种情况下您可以使用的主要类型取决于您的要求

has_many :groups, through: join_table

其中连接表通过具有user_id和group_id来引用用户和组。这使您可以获得与组成员身份相关的其他信息,也许您想要加入日期或会员ID或类似内容。

has_and_belongs_to_many :groups

以类似的方式实现,但是通过评估连接模型,只需要给出关系两侧的组/用户列表

多态关系不会真正发挥作用,除非您计划拥有不同类型的成员资格,可能是团体或组织或需要类似但独立的数据库表的东西。