通过模型设置 has_many 的限制

Setting limitations across has_many through models

这些是我的模型:

class User < ActiveRecord::Base
  has_many :memberships
  has_many :groups, through: :memberships
end

class Group < ActiveRecord::Base
  has_many : memberships
  has_many :users, through: :memberships
  belongs_to :group_type
end

class Membership < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
end

class GroupType < ActiveRecord::Base
  has_many :groups
end

我想为用户分配群组。群组有多种类型,用户只能从每种类型中选择一个群组。在视图中,每个组类型都应该有一个 select 标记(用户不必是每个组类型的成员)。

我可以在成员模型中添加一个 type_id 列,并为每个新用户的每个组创建一个实例,然后更新行,例如(对于类型 1):

<%= form_for (@user) do |f|
<% @membership = Membership.where (user_id: :@user.id,  group_type: :1) %>
<%= f.collection_select (:membership, :group_id, Group.all.where(type: 1), :id, :name) %>  
<% end %>

(不确定是否有效)

无论如何,我确定有更好的方法.. 如何将模型与每个类型限制的一组连接起来? (当然,还有一种编辑现有会员资格的方法)。

我会感谢任何帮助...

谢谢!

你的模型结构看起来不错。您还可以在成员资格中包含 group_type,然后验证唯一性。

class Membership < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
  belongs_to :group_type

  validates :user_id, uniqueness: { scope: [:group_id, :group_type_id],
message: "can only join one group of this type." }
end

表单应创建一个成员。

<%= form_for (Membership.new) do |f|
  <%= f.hidden_field :user_id, value: @user.id %>
  <%# your selection for a group %> 
<% end %>

在控制器中,您必须从数据库加载组,然后将 group_type_id 添加到参数和 .save -> 验证将处理其余部分。