gpt4 book ai didi

mysql - 无法获得适用于 has_many 的动态条件 :through (+ ownership)

转载 作者:行者123 更新时间:2023-11-29 21:24:38 25 4
gpt4 key购买 nike

仍在寻找解决方案 (2/24/16)

我的用户模型与组之间存在 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_management_groups 完全为 EMPTY,但 @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

然后将用户创建的每个新组附加到其托管组

最佳答案

我会选择以下内容:

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

如果您需要允许用户将成员(member)资格与任何其他模型相关联,这还可以让成员(member)资格在未来变得灵活。

希望这有帮助!

后续编辑

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 连接表中。这将允许您添加逻辑来确定哪个群组成员可以管理该群组。

希望后续内容能有所帮助。

关于mysql - 无法获得适用于 has_many 的动态条件 :through (+ ownership),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35568207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com