2

私は3つのモデル(受信者、アワード、アナウンサー)を含むプロジェクトに取り組んでおり、アナウンサーが複数の受信者にアワードを発行する場合は、ネストされた属性が必要です。たとえば、アワードフォームには次の3つのことを実行する機能が必要です。

  1. 複数の受信者を追加できます(つまり、「受信者の追加」、「受信者の削除」)-ネストされた属性
  2. 新しいアワードを作成した後、アワードは受信者のプロファイルに投稿されます。
  3. @recipient.awardsおよび@announcer.awardsの将来のポーリングを有効にします

この問題を賢く解決する方法に関しては本当に苦労しています。次のデータ構造は理にかなっていますが、アワードフォームで「accepts_nested_attributes_for:recipients」を実行することはできません。手伝ってくれますか?よろしくお願いします。

クラスRecipient<ActiveRecord:: Base

  • has_many:awards
  • has_many:announcers、:through =>:awards

終わり

クラスアナウンサー<ActiveRecord::Base

  • has_many:awards
  • has_many:recipients、:through =>:awards

終わり

クラス賞<ActiveRecord::Base

  • 所属する:announcer
  • 所属する:受信者

終わり

4

1 に答える 1

4

あなたはちょうどそこにいます。主な問題は、アワードと別のオブジェクト(ユーザー)との関係を作成するだけでなく、フォームに受信者オブジェクトを作成しようとしていることです。あなたはこのようなことをすることができます:

class User < ActiveRecord::Base
  has_many :recipients
  has_many :awards, :through => :recipients
end

# this is your relationship between an award and a user
class Recipient < ActiveRecord::Base
  belongs_to :user
  belongs_to :award
end

class Award < ActiveRecord::Base
  has_many :recipients
  has_many :users, :through => :recipients
  belongs_to :announcer

  accepts_nested_attributes_for :recipients, :allow_destroy => true
end

class Announcer < ActiveRecord::Base
  has_many :awards
  has_many :recipients, :through => :awards
end

次に、recipients_attributes配列を構築するネストされたフォームを実行します。

<%= form_for @award do |f| %>

  <%= f.text_field :name %>

  <div id="recipients">
    <% @award.recipients.each do |recipient| %>

     <%= render :partial => '/recipients/new', :locals => {:recipient => recipient, :f => f} %>

    <% end %>
  </div>
  <%= link_to_function 'add recipient', "jQuery('#recipients').append(#{render(:partial => '/recipients/new').to_json})" %>

<% end %>

そして、それをDRYに保つには、ネストされた部分を部分的にプッシュするだけです。

# app/views/recipients/_new.html.erb
<% recipient ||= Recipient.new %>
<%= f.fields_for 'recipients_attributes[]', recipient do |rf| %>
  <%= rf.select :user_id, User.all %>
  <%= fr.check_box '_delete' %>
  <%= fr.label '_delete', 'remove' %>
<% end %>

明らかに、User.all呼び出しは理想的ではないため、オートコンプリートを作成することもできます。

于 2011-03-18T23:29:03.077 に答える