3

一緒にリンクする必要がある3 つのテーブル ( productscustom_attribute、 ) があります。、、およびattribute_valueを持つattribute_value_mapsテーブルがあります。product_idcustom_attribute_idattribute_value_id

私の製品モデルaccepts_nested_attributes_for :attribute_value_mapsaccepts_nested_attributes_for :attribute_values.

私の製品フォームには、次のような新しい attribute_values のフィールドがあります。

<input id="product_attribute_values_attributes_1_custom_attribute_id" name="product[attribute_values_attributes][1][custom_attribute_id]" value="1" type="hidden">
<input id="product_attribute_values_attributes_1_attribute_value_name" name="product[attribute_values_attributes][1][name]">

コントローラーはベーシック@product.update_attributes(paras[:product])

これにより、attribute_valueレコードが適切に作成されますが、attribute_value_mapレコードは nil で保存されcustom_attribute_idます。

質問 1:attribute_value_mapこの方法でレコードを適切に保存する簡単な方法はありcustom_attribute_idますか?

質問 2:既に map レコードがあったとします。 name の入力を追加するとproduct[attribute_values_attributes][1][attribute_value_map_id]、有効なフィールドではないと怒鳴られます。新しい attribute_value の作成中に既存のマップ レコードを更新するにはどうすればよいですか?

編集 1: 詳細をリクエスト

製品モデル:

has_many :custom_attributes, :through => :attribute_value_maps
has_many :attribute_value_maps, :dependent => :destroy
has_man :attribute_values, :through => :attribute_value_maps
accepts_nested_attributes_for :attribute_value_maps
accepts_nested_attributes_for :attribute_values

custom_attribute モデル

has_many :attribute_value_maps

attribute_value モデル

belongs_to :custom_attribute
has_many :attribute_value_maps

attribute_value_map モデル

belongs_to :product
belongs_to :custom_attribute
belongs_to :attribute_value
4

1 に答える 1

0

あなたがここで何をしようとしているのかを理解できれば、ActiveRecord を使用して多くの苦労をしている可能性があると思います。

この種の動的属性が、NoSQL データベースが作成された理由です。Mongoid/MongoDB のようなものがより良い選択肢であるかどうかを検討することをお勧めします:

少なくとも、ActiveRecord の Serialize 機能を検討することをお勧めします。

http://api.rubyonrails.org/classes/ActiveRecord/Base.html一番下のシリアライズ機能を見てください。

Postgres を使用している場合は、ネイティブ データベース形式を使用してプロパティ フィールドのインデックス作成を可能にする hstore 拡張機能を調べることができます。

https://github.com/softa/activerecord-postgres-hstore

上記の何かがお役に立てば幸いです:)

于 2012-09-18T08:38:07.500 に答える