2

私は2つのモデルを持っています:

class Customer < ActiveRecord::Base
  has_many :contacts
end

class Contact < ActiveRecord::Base
  belongs_to :customer
  validates :customer, presence: true
end

次に、コントローラーで、「1 つの」スイープで両方を作成できると期待します。

@customer = Customer.new
@customer.contacts.build
@customer.save

これ, 失敗します (残念ながら翻訳がオンになっています. 次のように翻訳されます: 連絡先: 顧客を空白にすることはできません.)

@customer.errors.messages #=> :contacts=>["translation missing: en.activerecord.errors.models.customer.attributes.contacts.invalid"]}

モデルを調べると、確か@customer.contacts.first.customernil. @customerが保存されていないため、これはどういうわけか意味がありidます。

このような関連モデルを構築して保存/作成するにはどうすればよいですか?

  • モデルが無効な場合、モデルは永続化されません。
  • エラーは、すべてのモデルからのエラー メッセージを組み合わせるのではなく、1 つのリストで読み取ることができます。
  • コードを簡潔に保ちますか?
4

3 に答える 3

2

Rails api docから

アソシエーションを (単に読み取るのではなく) 変更する場合は、結合モデルのソース アソシエーションに :inverse_of オプションを設定することをお勧めします。これにより、保存時に適切な結合モデル レコードを自動的に作成する関連レコードを作成できます。(上記の「関連付け結合モデル」セクションを参照してください。)

したがって、単純:inverse_ofに関係宣言 (など) に追加するとhas_many、モデルが正しい順序で保存されます。belongs_toactive_record

于 2013-09-25T12:46:11.373 に答える
1
  • 最初に頭に浮かんだのは、その検証を取り除くことです。
  • 2 番目に頭に浮かんだことは、最初に顧客を救い、彼らが連絡先を構築することです。
  • 3 つ目::inverse_of関係を宣言するときに使用します。同様に役立つかもしれません。
于 2013-09-25T11:12:31.267 に答える
0

新しく作成した関連モデルを単一のデータベース トランザクションで保存できますが、saveメソッドを 1 回呼び出すだけでは保存できません。一部の ORM (LINQToSQL や Entity Framework など) では実行できますが、ActiveRecord では実行できません。メソッドを使用ActiveRecord::Base.transactionして、両方のモデルが保存されているか、いずれも保存されていないことを確認してください。ActiveRecord とトランザクションの詳細については、http: //api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html をご覧ください。

于 2013-09-25T11:19:18.000 に答える