我的用户模型与群组有一个has_many:through关系。因此,用户有许多组,组有很多用户,但我也希望由一个用户建立该组的所有权,这个用户可以做出最终的决定。
想法是user.groups是用户所属的所有组,user.managed_groups是用户拥有/管理的所有组。如果有人知道更好的方法来构建这个,那将非常感谢帮助!
以下代码是我现在的设置。
class UserGroup < ActiveRecord::Base
belongs_to :user
belongs_to :group
end
class Group < ActiveRecord::Base
has_many :user_groups
has_many :members, :through => :user_groups, :class_name => "User", :source => :user
...
class CreateGroups < ActiveRecord::Migration
def change
create_table :groups do |t|
t.integer :user_id, :null => false, :default => 0
t.string :name, :null => false
t.timestamps null: false
end
add_index :groups, :user_id
end
end
class User < ActiveRecord::Base
has_many :user_groups
has_many :groups, :through => :user_groups
has_many :managed_groups ,-> { where(groups: { user_id: @id }) },
through: :user_groups, class_name: "Group", source: :group,
dependent: :destroy
...
@user = FactoryGirl.create :user
@group = FactoryGirl.create :group
@group.user_id = @user.id
@group.members << @user
@group.save
@user.reload
结果是@user.all_managed_groups
完全是空的,但@user.groups
不是。
def all_managed_groups
groups.where("groups.user_id = ?", id)
end
def all_managed_groups
Group.find_by_user_id(id)
end
def all_managed_groups
Group.where("groups.user_id = ?", id)
end
执行上述测试代码后,这些代码都返回空关联代理
has_many :managed_groups, class_name: "Group",
dependent: :destroy
然后将用户创建的每个新组附加到其managed_groups
答案 0 :(得分:0)
我会选择以下内容:
class Group < ActiveRecord::Base
belongs_to :owner, class_name: "User", foreign_key: "user_id"
has_many :memberships, as: :memberable
has_many :users, through: :memberships
end
class User < ActiveRecord::Base
has_many :memberships
has_many :groups, through: :memberships, source: :memberable, source_type: "Group"
...
end
class Membership < ActiveRecord::Base
belongs_to :user
belongs_to :memberable, polymorphic: true
...
end
如果您需要允许用户与任何其他模型相关联的成员资格,这也允许Membership
在未来具有灵活性。
希望这有帮助!
class User < ActiveRecord::Base
has_many :managed_groups, foreign_key: "user_id", class: Group
has_many :user_groups
has_many :groups, through: :user_groups
end
class Group < ActiveRecord::Base
belongs_to :user
has_many :user_groups
end
class UserGroup < ActiveRecord::Base
belongs_to :user
belongs_to :group
end
user = User.create(name: "David")
group = Group.create(user_id: user.id, name: "Dayton Ruby")
user.managed_groups => [#<Group id: 1, user_id: 1, name: "Dayton Ruby">]
user.groups => [] (I have not added this user to the UserGroup join table yet)
# adding user as a group member (separate from ownership)
user << groups
user.groups => [#<Group id: 1, user_id: 1, name: "Dayton Ruby">]
如果您希望所有者成为某个组的成员(而不是手动设置),您还可以查看在UserGroup联接表中添加role
,admin
等字段。这将允许您添加逻辑以确定哪个组成员可以管理该组。
希望后续帮助一些人。