Railsを初めて使用し、アジャイルWeb開発で見つかったDepotプロジェクトをRails 3.1。 「ビルド」メソッド。
@cart = current_cart
product = Product.find(params[:product_id])
@line_item = @cart.line_items.build(product: product)
私のグーグル検索により、.buildメソッドは、テーブル内の行を(テーブル間の関連付けを使用して)作成するよりクリーンな方法にすぎないことを理解するようになりました。しかし、上記のコードでは、コードは次のようになります。
@line_item = @cart.line_items.build(product_id => params[:product_id])
作成者がproduct_idを取得するだけでなく、product(product = Product.find(params [:product_id]))の行全体を格納しなければならなかった理由がわかりません...
私が理解できる以上のものがありますか?
build
を誤解しました。これはnew
のエイリアスであり、特別なものではありません。 https://github.com/Rails/rails/blob/959fb8ea651fa6638aaa7caced20d921ca2ea5c1/activerecord/lib/active_record/relation.rb#L84
build
はデータベースにレコードを「作成」せず、メモリに新しいオブジェクトを作成するだけで、ビューはこのオブジェクトを取得して、特にフォームの場合に何かを表示できます。
2番目の質問については、はい、IDで作成する方法も同様に機能します。しかし、より良いアプローチはparamを信頼しないことです。代わりに、最初にdbで検索して確認します。
先に進み、あなたは完全に正しいと言います。どちらの方法でも機能し、同じことを行いますが、バージョンは:product_id
はより効率的で、データベースクエリが1つ少なくて済みます。つまり、コードの後半でそのproduct
変数が必要な場合、または特定の行項目がproduct.{something}
後で、その時点でIDで取得する必要はありません。
ただし、個人的には:product_id
、最初にオブジェクトを見つける理由はありません。