在轨道上的ruby上构建方法

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

@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 = Product.find(params [:product_id]))而不是仅仅获取product_id …

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

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

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

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

我要继续说你是完全正确的。 这两种方法都可以工作并且会做同样的事情,但是使用just :product_id版本效率更高,并且需要少一个数据库查询。 也就是说,如果您在代码中稍后需要该product变量或者特定的行项目稍后调用product.{something} ,那么它可能是有意义的,因此它不必在那时通过id获取它。

但是,我个人更愿意只设置:product_id ,我认为没有理由先找到对象。