41

Railsは初めてで、Rails 3.1を使用したアジャイルWeb開発にあるDepotプロジェクトに従っています。本が「ビルド」メソッドを使用したときに迷子になるまで、すべてが順調でした。

@cart = current_cart
product = Product.find(params[:product_id])
@line_item = @cart.line_items.build(product: product)

Google 検索の結果、.build メソッドは (テーブル間の関連付けを使用して) テーブル内に行を作成するためのよりクリーンな方法であることがわかりました。しかし、上記のコードでは、コードが次のようになると予想していました。

@line_item = @cart.line_items.build(product_id => params[:product_id])

作成者が product_id を取得するだけでなく、製品の行全体( product = Product.find(params[:product_id])) を保存しなければならなかった理由がわかりません...

私が理解できる以上のことはありますか?

4

2 に答える 2

80

あなたは誤解しbuildました。の単なるエイリアスでありnew、特別なことは何もありません。https://github.com/rails/rails/blob/959fb8ea651fa6638aaa7caced20d921ca2ea5c1/activerecord/lib/active_record/relation.rb#L84

buildデータベースにレコードを「作成」するのではなく、メモリに新しいオブジェクトを作成するだけで、ビューがこのオブジェクトを取得して何か、特にフォームを表示できるようになります。

2 番目の質問については、はい、ID で作成する方法も同様に機能します。しかし、より良いアプローチは、param を信頼しないことです。代わりに、最初に db を検索して確認してください。

于 2013-11-04T05:34:06.863 に答える
1

私は先に進み、あなたが完全に正しいと言います。どちらの方法でも機能し、同じことを行いますが、just を使用したバージョンの:product_id方が効率的で、必要なデータベース クエリが 1 つ少なくなります。とはいえ、コードの後半でその変数が必要な場合productや、特定の項目がproduct.{something}後で呼び出す場合は、その時点で id でフェッチする必要がないため、意味があるかもしれません。

ただし、個人的には を設定することを好み:product_idます。最初にオブジェクトを見つける理由はありません。

于 2013-11-04T04:52:38.250 に答える