我正在阅读使用 Rails 进行敏捷 Web 开发。他们使用了以下语法:
item = cart.line_items.build(product_id: product_id)
我的问题是:
上述声明中究竟发生了什么?程序的哪些部分被调用?我找不到详细的解释。
为什么使用构建然后保存而不是简单地创建?
我正在阅读使用 Rails 进行敏捷 Web 开发。他们使用了以下语法:
item = cart.line_items.build(product_id: product_id)
我的问题是:
上述声明中究竟发生了什么?程序的哪些部分被调用?我找不到详细的解释。
为什么使用构建然后保存而不是简单地创建?
上面的行创建了一个与购物车关联的新 line_item,并使用 product_id 进行了初始化。Build 本质上是一个很好的 DSL,它允许您利用现有的关系来创建新对象。它只是利用has_many: :line_items
购物车中的关系和标准 Object.new
这种方法的优点是您可以免费获得与购物车的关联,而不是执行以下操作:
line_item = LineIten.new
line_item.cart = cart
line_item.product_id = product_id
当在模型定义中调用该has_many :association_name
方法时,会创建多个方法,其中之一是.association_name
方法,它使 SQL 查询选择该关联中的所有对象。
要了解有关此的更多信息,请转到您的终端,输入rails c
,然后您就可以开始尝试它是如何工作的了。
查看文档以查看在定义关系时将多少自动生成的方法注入到 Object 中:has_many
在所有这些中,它是collection.build
.
1)这个方法只是一个助手,所以你只需要写一行,否则需要不止一个。
2) 不是特殊原因,取决于上下文,有时你只想初始化对象而不保存它。如果要在初始化后保存对象,请使用其他自动生成的方法 collection.create!