0

私のアプリケーションは次の 5 つのモデルで構成されています。スーパーマーケットにはさまざまなカテゴリの製品があり、これらのカテゴリの製品は複数のブランドによって製造されています。

ここで、スーパーマーケットに 1 つ (または 2 つ)の選択フィールドが必要です。このフォームでは、 Category内の 1 つの要素をその名前が表示されて選択でき、 Brand内の 1 つ以上の要素をその名前が表示された状態で選択できます。これはOriginに格納できます。

が使えると思いますがcollection_select、ここではどのように活用すればよいでしょうか。

class Supermarket < ActiveRecord::Base
  has_many :supplies
  has_many :origins, :through => :supplies
end

class Supply < ActiveRecord::Base  
  belongs_to :origin  
  belongs_to :supermarket  
end

class Origin < ActiveRecord::Base
  belongs_to :category
  belongs_to :brand
end

class Category < ActiveRecord::Base
  has_many :origins
end

class Brand < ActiveRecord::Base
  has_many :origins
end

おそらく、私もモデルを微調整する必要があります...


編集

フォームの結果がどうあるべきかを明確にするには:

スーパーマーケットを編集するフォームで、製品のカテゴリと対応するブランドを選択して、どのカテゴリとこのカテゴリのどのブランドがこの特定のスーパーマーケットで販売されているかがわかるようにします。

スーパーマーケット (フォーム):

スーパーマーケットの名前:ウォルマート


カテゴリ(1 つ選択):

  • コーラ(Category_ID 1)
  • コーンフレーク(Category_ID 2)
  • ...

ブランド(複数選択)

  • The Coca-Cola Company (Brand_ID 1)
  • ペプシコ(Brand_ID 2)
  • ケロッグ社(Brand_ID 3)
  • ...

これにより、 Originに次のようなエントリが作成されます。

スーパーマーケット_ID カテゴリ_ID ブランド_ID
      1 1 1
      1 1 2
      2 1 2
      2 2 3
     ... ... ...

/編集


編集 2

この質問への回答によると、次のようにコンソールからエントリを作成または選択できます。

walmart = Supermarket.create(:name => "Walmart");
cornflakes = Category.create(:name => "Corn Flakes");
kellogs = Brand.create(:name => "Kellog's");

walmart.origins.create(:category_id => cornflakes, :brand_id = kellogs)

フォームを介してこれを利用するにはどうすればよいですか? どうすれば利用できますselectか、collection_selectまたは使用できる別のヘルパーがありますか?

/編集 2

4

1 に答える 1

0

多対多の関係を利用するときにも同様の問題がありました。チェックする価値のある gem の 1 つはsimple_formです。

to_many アソシエーション用の優れたフォーム ヘルパーがあります。

実際にフォームを実装するという点では、フォーム データがどのように使用されるのか理解できていません。いずれにせよ、JavaScript と仮想属性はここでの友達です。

編集:

ああ、私はあなたが言っていることがわかります。これを行う方法は、カテゴリを選択するために 1 つの select_field を作成し、次に別の select_field を作成して (:multiple => true に設定)、複数のブランドを選択できるようにすることです。

<%= select_tag "supermarket[supplies][][category]" ... %>
<%= select_tag "supermarket[supplies][][brands]", ... %> <!-- be sure to set multiple to true !-->

次に、すべてを関連付ける必要があります。そのために、フォームの送信を処理する仮想属性を作成します。例えば:

def supplies=(supplies_hash)
# read supplies_hash and create the active records. 
end

def supplies

end

最後に、gem なしでこれを行うことを主張している場合は、ネストされたフォーム railscastを確認することをお勧めします。何が関係しているかを理解するために。

于 2012-09-19T17:29:12.933 に答える