web-dev-qa-db-ja.com

ビルドメソッドon Ruby on rails

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]))の行全体を格納しなければならなかった理由がわかりません...

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

32
Finks

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

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

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

59
Billy Chan

先に進み、あなたは完全に正しいと言います。どちらの方法でも機能し、同じことを行いますが、バージョンは:product_idはより効率的で、データベースクエリが1つ少なくて済みます。つまり、コードの後半でそのproduct変数が必要な場合、または特定の行項目がproduct.{something}後で、その時点でIDで取得する必要はありません。

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

1
nzifnab