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

标签 mysql ruby-on-rails ruby activerecord ruby-on-rails-4.2

仍在寻找解决方案 (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/

相关文章:

ruby-on-rails - 验证关联的唯一性

ruby-on-rails - 如何在 Ruby on rails 3 中使用 Phonegap

mysql - 无法在 vagrant box 上使用 chef cookbook 安装 mysql-client

mysql内连接3个表和联合

php - 为什么使用 PHP 从数据库中读取转义字符,在正则表达式替换期间显示为输出中的普通文本?

php更新到mysql,数组不更新

ruby-on-rails - 验证或不验证 bool 字段

php - Magento 将产品从一个数据库复制到另一个数据库

ruby-on-rails - Devise - 如何禁止某些用户登录?

ruby-on-rails - Rails、路由和 REST