1

私はまだRailsにかなり慣れていないので、これを行おうとしている方法が非効率的であるか、単にばかげていると確信していますが、これが私が達成しようとしていることです。ケース (患者のケース ファイル) とインベントリ (ケースで使用される医療移植材料) の 2 つのモデルがあります。

class Case < ActiveRecord::Base
  has_many :inventories
  accepts_nested_attributes_for :inventories, :reject_if => :all_blank
end

class Inventory < ActiveRecord::Base
  belongs_to :case
end

目録は別のプロセスで作成され、ケース フォームを通じてそれらをケースに関連付けることが目標です。私がやろうとしているのは、作成中のケースに関連付ける目的のインベントリを選択するためのチェックボックスとともに、利用可能なインベントリを一覧表示するテーブルをケース フォームに配置することです。これは、各在庫のいくつかの属性 (:case_price と :case_ship_price) に対してネストされたフィールドを含める必要があるため、さらに複雑になります。私はこれまで、has_many を使用して関連付けを使用し、それらの属性をピボット テーブルに保存する非常に遠回りの方法でこれを行っていましたが、params からフィールド入力をキャプチャし、このブロックを介してそれらを保存するためのハッキー コードが必要でした。

class CasesController < ApplicationController
  def create
    @case = Case.new(params[:case])
    if @case.save
      @case.case_lineitems.each do |li|
        li.update_attributes(:price => params[:lineitem_price][li.inventory_id.to_s],
                             :shipping_cost => params[:lineitem_shipping][li.inventory_id.to_s])
      end
      redirect_to @case
    else
      render 'new'
    end
  end
end

これは非常にぎこちなく、問題が発生するのではないかと心配していたので、単純な has_many, belongs_to の関係を試してみました。<%= check_box_tag :inventory_ids, inventory.id, @case.inventories.include?(inventory), name: 'case[inventory_ids][]' %>ただし、そのタイプの関係に典型的な機能があるかどうかはわかりません. 現在、私のフォームのこのセクションは次のようになっています。

<table>
  <thead>
    <tr>
      <th></th>
      <th>Product</th>
      <th>Serial #</th>
      <th>Price</th>
      <th>Shipping</th>
    </tr>
  </thead>
  <tbody>
    <% @inventories.each do |inventory| %>
      <tr>
        <td>
          <%= check_box_tag :inventory_ids, inventory.id, @case.inventories.include?(inventory), name: 'case[inventory_ids][]' %>
        </td>
        <td><%= inventory.product.name %></td>
        <td><%= inventory.serial_num %></td>
        <%= f.fields_for :inventories, inventory do |inv| %>
          <td>
            <%= inv.text_field :case_price %>
          </td>
          <td>
            <%= inv.text_field :case_ship_price %>
          </td>
        <% end %>
      </tr>
    <% end %>
  </tbody>
</table>

これにより、最初のチェックボックスがデフォルトでオンになり、すべてをオフのままにすると、送信時にすべてのインベントリが関連付けられます。サブセットのみをチェックすると、 の行に沿って例外が発生しCouldn't find Inventory with ID=206 for Case with ID=ます。最後に、すべてのインベントリをチェックすると、関連付けとネストされた属性が正しく保存されるようです。

希望どおりに動作するようにこれをクリーンアップするにはどうすればよいですか? has_many スルー リレーションシップに戻る必要がある場合、ピボット テーブルの行を作成するのと同じフォームで、ピボット テーブルの属性を保存するより良い方法はありますか? この課題から抜け出すには、いくら検索しても解決しないので、これについて何か助けていただければ幸いです。

4

0 に答える 0