无法为has_many工作获得动态条件:通过(+所有权)

时间:2016-02-23 03:22:47

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

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

我的用户模型与群组有一个has_many:through关系。因此,用户有许多组,组有很多用户,但我也希望由一个用户建立该组的所有权,这个用户可以做出最终的决定。

想法是user.groups是用户所属的所有组,user.managed_groups是用户拥有/管理的所有组。如果有人知道更好的方法来构建这个,那将非常感谢帮助!

以下代码是我现在的设置。

UserGroup模型(连接表)

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

1 个答案:

答案 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联接表中添加roleadmin等字段。这将允许您添加逻辑以确定哪个组成员可以管理该组。

希望后续帮助一些人。