Ruby on rails 通过关系编辑具有多个的多个条目

Ruby on rails 通过关系编辑具有多个的多个条目,ruby-on-rails,simple-form,Ruby On Rails,Simple Form,我正在为我的rails应用程序构建一个会员系统,并拥有以下模型(无需验证和其他一切): class用户{where(角色:2)} 结束 我希望用户能够在一个地方编辑一个组的所有成员资格。每个组应有三个多选择字段来选择管理员、用户和来宾。对于生成表单,我使用简单表单 它应该看起来像,但是填充了用户名(这应该是最简单的部分)和每个用户级别的预选用户 不同的内置解决方案,如f.association不起作用。我为:users(生成三个相同的select字段)和:memberships尝试了这个方法

我正在为我的rails应用程序构建一个会员系统,并拥有以下模型(无需验证和其他一切):

class用户
成员资格模型包含一个保存成员资格级别的自定义属性

class Membership < ActiveRecord::Base
  belongs_to :subgroup
  belongs_to :user

  scope :guests, -> { where( role: 0 ) }
  scope :users, -> { where( role: 1 ) }
  scope :admins, -> { where( role: 2 ) }
end
类成员资格{where(角色:0)}
作用域:用户,->{where(角色:1)}
作用域:admins,->{where(角色:2)}
结束
我希望用户能够在一个地方编辑一个组的所有成员资格。每个组应有三个多选择字段来选择管理员、用户和来宾。对于生成表单,我使用简单表单

它应该看起来像,但是填充了用户名(这应该是最简单的部分)和每个用户级别的预选用户

不同的内置解决方案,如
f.association
不起作用。我为
:users
(生成三个相同的select字段)和
:memberships
尝试了这个方法


因此,我正在寻求有关构建视图和控制器的帮助。

您必须在子组中使用作用域,但不能在成员资格中使用作用域

class User < ActiveRecord::Base
  has_many :memberships
  has_many :subgroups, through: :memberships

  scope :guests, -> { includes(:memberships).where('memberships.role' => 0) }
  scope :users,  -> { includes(:memberships).where('memberships.role' => 1) }
  scope :admins, -> { includes(:memberships).where('memberships.role' => 2) }
end
class用户{includes(:memberships).where('memberships.role'=>0)}
作用域:用户,->{includes(:memberships).where('memberships.role'=>1)}
作用域:admins,->{includes(:memberships).where('memberships.role'=>2)}
结束
或者最好与lambda wenn建立新的联系,你不会用简单的形式

class Subgroup < ActiveRecord::Base
  has_many :memberships
  has_many :users, through: :memberships

  has_many :only_guests, -> { where('memberships.role' => 0).uniq }, through: :memberships, source: :user
  has_many :only_users,  -> { where('memberships.role' => 1).uniq }, through: :memberships, source: :user
  has_many :only_admins, -> { where('memberships.role' => 2).uniq }, through: :memberships, source: :user

end
类子组{where('memberships.role'=>0).uniq},通过::memberships,source::user
有很多:只有用户,->{where('memberships.role'=>1).uniq},通过::memberships,source::user
拥有_many:仅_管理员,->{where('memberships.role'=>2).uniq},通过::memberships,source::user
结束
视图:



当我使用simple_form时,我尝试在视图中使用
的第二种解决方案。但是它返回
SQLite3::SQLException:没有这样的列:users.role:从“users”内部选择不同的“users”。*加入“users”上的“memberships”。“id”=“memberships”。“user\u id”其中的“users”。“role”=1和“memberships”。“subgroup\u id”=?
正确!您必须:has_many:only_users,->{where('memberships.role'=>1).uniq},通过::memberships,source::users,然后它不加入表。结果ist
SQLite3::SQLException:没有这样的列:memberships.role:从“memberships”中的“users”中选择不同的“users”。“role”=1
编辑:role是membership的属性,其中表是属性“role”?我必须使用
来显示SELECT字段。现在它起作用了。你能把这个加到你的答案里吗?
class Subgroup < ActiveRecord::Base
  has_many :memberships
  has_many :users, through: :memberships

  has_many :only_guests, -> { where('memberships.role' => 0).uniq }, through: :memberships, source: :user
  has_many :only_users,  -> { where('memberships.role' => 1).uniq }, through: :memberships, source: :user
  has_many :only_admins, -> { where('memberships.role' => 2).uniq }, through: :memberships, source: :user

end
<%= f.association :only_users, as: :check_boxes, collection: User.all %>