0

モデルでhas_manyリレーションシップが宣言されると、アクセサー メソッドが動的に追加され、id の配列を渡すことができます。

class Example < ActiveRecord::Base
   has_many :foos
end

これにより、次のことが可能になります。

$ m = Example.create!
$ m.foo_ids = [1, 2, 3]

ただし、has_one関係が宣言されると、そのようなアクセサーが作成されます。

class Example < ActiveRecord::Base
   has_one :foo
end

許可しないもの:

$ m = Example.create!
$ m.foo_id = 1 # No method error

なぜこの不一致があるのですか?

ID を使用してフォームから複数の関連付けを設定できるのに、単一の関連付けを設定するには、ネストされたフォームが必要でありaccepts_nested_attributes_for、モデルで を定義する必要があるのはなぜですか? これは API の不一致のように感じます。

4

5 に答える 5

1

ガイドに従って、collection_singular_ids=(m.foo_ids=) メソッドは、必要に応じて追加および削除することにより、指定された主キー値によって識別されるオブジェクトのみをコレクションに含めます。つまり、id [1, 2, 3] を持つ foo がサンプル m に割り当てられます。

現在、foo オブジェクトの配列をパラメーターとして受け取り、それらの foo を example に関連付ける別のメソッドcollection=objects(m.foo=) があります。

最後に、関連付けを使用してhas_oneいる場合、例に関連付けられるオブジェクトは 1 つだけです。したがって、同じ作業に2つの異なるメソッドは必要ありません。したがって、collection_singular_id=混乱するためメソッドはありませんがassociation=(associate)、関連付けを割り当てるメソッドはあります。

ガイドから:

association= メソッドは、関連付けられたオブジェクトをこのオブジェクトに割り当てます。バックグラウンドでは、これは、このオブジェクトから主キーを抽出し、関連オブジェクトの外部キーを同じ値に設定することを意味します。

于 2013-10-22T11:42:32.273 に答える
1

"{{association_name}}_id"これは、アクセサーを作成する関連付けマクロが事実上ないためActiveRecordです。これは、DB テーブルの列に基づいて作成されます。また、has_one関連付けは、関連付けられたモデルに外部キー列があることを意味するため、関連付けが DB スキーマに一致する場合、エラーは発生しません。

foo = Foo.new
foo.example_id
于 2013-10-22T10:49:03.327 に答える
0

そのアクセサーを単一のインスタンス用に作成する必要があるのはなぜですか? ID の配列を渡す必要はありません。アクセサーfoo_id=は と同等ですがfoo.id=、なぜそれを作成するのでしょうか?

于 2013-10-22T10:59:33.653 に答える
-2

動的に生成されたアクセサーの場合、モデルで method_missing を使用する必要があります。

動的に関連付けられたモデルを使用するには、ポリミルフィック関連付けを使用します。

于 2013-10-22T10:52:02.837 に答える