Ruby on rails 使用已完成的多个编辑模型属性

Ruby on rails 使用已完成的多个编辑模型属性,ruby-on-rails,ruby,model,associations,has-many-through,Ruby On Rails,Ruby,Model,Associations,Has Many Through,我已经成功地创建了一个与我的两个模型通过连接。总之,每个艺术家可以属于多个组,反之亦然: # artist.rb has_many :memberships has_many :groups, through: :memberships # membership.rb belongs_to :artist belongs_to :group # group.rb has_many :memberships has_many :artists, through: :me

我已经成功地创建了一个
与我的两个模型通过
连接。总之,每个艺术家可以属于多个组,反之亦然:

# artist.rb
  has_many :memberships
  has_many :groups, through: :memberships

# membership.rb
  belongs_to :artist
  belongs_to :group

# group.rb
  has_many :memberships
  has_many :artists, through: :memberships
我想做的是设置一个
status
属性,该属性将是一个布尔值,并指示艺术家是否属于该组。因此,例如,如果一位艺术家离开该组,他/她将被标识为过去成员名为
状态的布尔值(true=当前成员,false=过去成员)

有几件事我不确定。第一个是决定将该属性分配给哪个模型。都是三个吗?是2/3还是1/3

我的第二个问题是创建一种方式,允许我在艺术家的编辑视图或他们所属的组中更改艺术家的成员身份。我希望做的是,如果从任何一个角度改变一个,这种改变都会反映在两个模型上

艺术家和团体演出视图可能会相互镜像,因此为了简洁起见,我只列出艺术家的演出视图:

艺术家秀视图

我唯一有麻烦的是列出过去的组。我应该为此特定场景设置范围还是方法

<h3>Member of:</h3>
<hr>
<% @artist.groups.each do |group| %>
    <%= artist.group.name %>
    <% if artist.group.status == false %>
        <h3>Past Member of: %></h3>
        <hr>
        <!-- <% Scope or Method that filters Past Groups %> -->
    <% end %>
<% end %>
成员:

前任成员:%%>
艺术家编辑视图

对于“编辑”视图,我似乎无法弄清楚的一件事是如何嵌套艺术家的每组。我的语法可能有点不对劲,但只是想让您了解我的意图:

<%= form_for @artist do |f| %>
  <h3>Memberships</h3>
  <% @artist.groups.each do |group| %>
    <%= f.group.radio_button :status, true %>
    <%= f.group.label :status, 'Current Member', value: true %>
    <%= f.group.radio_button :status, false %>
    <%= f.group.label :status, 'Past Member', value: false %>
  <% end %>
  <br>
  <%= f.submit %>
<% end %>

会员资格

组编辑视图

我假设这看起来几乎完全像艺术家编辑视图,但在某种程度上是相反的:

<%= form_for @group do |f| %>
  <h3>Memberships</h3>
  <% @group.artists.each do |artist| %>
    <div>
      <%= f.artist.radio_button :status, true %>
      <%= f.artist.label :status, 'Current Member', value: true %>
      <%= f.artist.radio_button :status, false %>
      <%= f.artist.label :status, 'Past Member', value: false %>
    </div>
  <% end %>
  <br>
  <%= f.submit %>
<% end %>

会员资格


如果需要任何控制器逻辑,我洗耳恭听。

首先,我会将其添加到
成员身份中,因为这是关系的真实指示器

由于您正在查看单个组或艺术家,因此它将是一个实例方法,而不是范围。比如:

class Group
  has_many :memberships
  has_many :artists, through: :memberships
  def past_artists
    artists.where(memberships:{status: false})
  end
end
#might be User not sure based on your code and your question
class Artist
  has_many :memberships
  has_many :groups, through: :memberships
  def past_groups
    groups.where(memberships:{status: false})
  end
end
那么您的组视图应该是

<% @group.memberships.each do |membership| %>
   <%= render '/memberships/membership_edit_form', membership: membership, obj: @group %>
<% end %>
请注意,“提交”按钮一次只更新一个成员关系

要一次更新多个,您应该能够做到这一点

<%= form_for @group do |f| %>
  <%= f.fields_for :memberships do |builder| %>
     <%= render '/memberships/membership_fields', f: builder, obj: @group %>
  <% end %>
  <%= f.submit %>
<% end %>

这应该允许您将它们作为类似
[:group][:memberships]的内容通过参数传递
但请注意,我认为要正确更新这些,您必须迭代集合。

在为我的
成员身份创建迁移后,我添加了您回答中提到的两种方法,但当我在rails控制台中尝试这两种方法时,我得到了
名称错误:未定义的局部变量或方法“艺术家”
@CarlEdwards I fixed
Artist
它应该说
,但是与您的关联
应该有一个
艺术家
方法,因为您有
有很多:艺术家,通过::会员身份
。让我确保我做得对。在rails控制台中,我首先做了
a=Artist.first
。然后是g=a组。最后我做了
g.status
,我得到了错误
NoMethodError:undefined方法'status'for#
在插入艺术家视图代码时也遇到了这个错误:
参数的数目错误(1代表2..3)
@CarlEdwards
status
应该是
会员资格的一部分,这样你就可以做
a=Artist。首先
然后运行类似
a.memberships.each{m | put“Group:{m.Group.name}status:{m.status}
的命令,它会输出类似“Group:Group-name-status:false”的命令“。艺术家和团体各自没有地位,他们只有协会的地位。
<%= form_for @group do |f| %>
  <%= f.fields_for :memberships do |builder| %>
     <%= render '/memberships/membership_fields', f: builder, obj: @group %>
  <% end %>
  <%= f.submit %>
<% end %>
<h5><%= obj.is_a?(Group) ? f.object.artist : f.object.group %></h5>
<%= f.label :status, "Current Member?" %>
<%= f.check_box :status %>