【问题标题】:Setting limitations across has_many through models通过模型设置 has_many 的限制
【发布时间】:2018-08-16 12:19:02
【问题描述】:

这些是我的模型:

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

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

我可以在成员模型中添加一个 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 %>

(不确定它会起作用)

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

我愿意提供任何帮助...

谢谢!

【问题讨论】:

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


    【解决方案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 %>
    

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

    【讨论】:

    • 谢谢!我不明白关于控制器的最后一部分。您的意思是创建(会员资格)时?
    • 当您在控制器中获得 params[:membership] 时,您必须在其中包含 :user_id、:group_id 和 :group_type_id。我认为从表格中你只会得到 :user_id 和 :group_id 所以你必须自己找出 :group_type_id 。您可以在模型上调用 *.save 之前在控制器中执行此操作
    • 抱歉,表单创建了一个新成员 - 我想这意味着我必须在创建新成员之前删除一个成员(如果两个组属于同一类型)。我错过了什么吗?我计划如果我输入带有 user_id 的表单,他当前的成员身份将被显示,如果需要,可以随时更改。
    • 您可以在会员模型的 before_validation 回调中处理所有这些情况。因此,如果已设置具有给定 category_type 的成员资格,请将其删除
    • 是的,但是现有的会员资格不会以我拥有的格式显示。您能否建议一种合适的表格,该表格将针对每种组类型显示当前组(如果有的话)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多