在轨道上的ruby上构建方法

Fin*_*nks 32 ruby-on-rails associations ruby-on-rails-3.1

rails的新手,我正在跟踪使用rails 3.1在Agile Web开发中找到的Depot项目.一切都很好,直到我迷失了本书使用"构建"方法.

@cart = current_cart
product = Product.find(params[:product_id])
@line_item = @cart.line_items.build(product: product)
Run Code Online (Sandbox Code Playgroud)

我的谷歌搜索让我明白.build方法只是一种在表格中创建行的更简洁的方法(表格之间有关联).但是在上面的代码中,我期待代码看起来像这样:

@line_item = @cart.line_items.build(product_id => params[:product_id])
Run Code Online (Sandbox Code Playgroud)

我不明白为什么作者必须存储整行产品(product = Product.find(params [:product_id]))而不是仅仅获取product_id ...

还有比我能理解的更多的东西吗?

Bil*_*han 60

你误解了build.它只是一个别名new,没什么特别的.https://github.com/rails/rails/blob/959fb8ea651fa6638aaa7caced20d921ca2ea5c1/activerecord/lib/active_record/relation.rb#L84

build 不会在数据库中"创建"记录,只需在内存中创建一个新对象,以便视图可以获取此对象并显示某些内容,尤其是对于表单.

对于你的第二个问题,是的,你通过id撰写的方式也会起作用.但更好的方法是不要相信参数.相反,首先通过在db中查找来验证它.

  • 澄清一下 - 在当前的 Rails 中,`ActiveRecord::Relation#build` 的别名为`ActiveRecord::Relation#new`,但`ActiveRecord::Associations::CollectionProxy#new` 的别名为`ActiveRecord::Associations::CollectionProxy #build`(相反的方向)。通过关联,`build`/`new` 将创建与记录 ID 适当关联的新记录。因此,Relation#build 和 Relation#new 与 CollectionProxy#build 和 CollectionProxy#new 的实现略有不同。但是,由于它们在两个类中都有别名,因此使用 `build` 或 `new` 并不重要。 (2认同)