通过模型设置has_many的限制

时间:2018-03-08 08:01:38

标签: ruby-on-rails has-many-through collection-select

这些是我的模特:

markerOptions!!.icon(BitmapDescriptorFactory.fromResource(R.id.cluster_icon))

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

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

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

(不确定它是否有效)

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

我会赞美任何帮助......

谢谢!

1 个答案:

答案 0 :(得分:1)

您的模型结构看起来很好。您还可以在成员资格中包含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 %>

在控制器中,您必须从DB加载组,而不是将group_type_id添加到params和.save - &gt;验证将处理其余部分。