ruby-on-rails - 这个 rails 3 .build 方法到底在做什么?

标签 ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

从著名的 agile web development with rails 书中摘录这段代码(最新版):

def create 

  @cart = current_cart 

  product = Product.find(params[:product_id])

  @line_item = @cart.line_items.build(product: product)

这是针对一般电子商务/depot 应用程序的,此功能针对特定产品的“添加到购物车”按钮。这是我感到困惑的地方:

我想象的代码是:

@line_item = line_items.build(product: product) 

@line_item = line_items.build(cart: @cart) 

基本上,如果 line_item 同时属于产品和购物车,我会分别创建这些关系。

此外,如果购物车还没有任何 line_items,那么我该怎么做 @cart.line_items?我知道 line_items.build(product: product) 会返回给我一个 line_item 对象(我将其保存到 @line_item 中),但是如何如果购物车中还没有 line_itemscart.line_items 是否有效?

最佳答案

Cart 模型中,很可能有一个 has_many 与名为 line_itemsLineItem 模型关联。 Rails 会自动用一个空数组初始化该关联。

你可以认为 @cart 被初始化为:

@cart = Cart.new
@cart.line_items = []

每次添加调用@cart.line_items.build时,都可以这样想:

new_line_item = LineItem.new cart: @cart
@cart.line_items.push new_line_item

注意:这绝对不是实际代码的工作方式,但您可以认为功能行为是相同的。

关于ruby-on-rails - 这个 rails 3 .build 方法到底在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11553824/

相关文章:

ruby-on-rails - 是否有 Rails gem 可以将推文从 Twitter 提取到我可以迭代的对象中?

ruby-on-rails - Rails 4.2 常量 - 将它们放在哪里 : application. yml 与自定义配置文件.rb

ruby-on-rails - 这是 Rails 3 中的竞争条件问题吗?

ruby-on-rails - 根据 rails 3 中的范围计算版税

ruby-on-rails - Rails belongs_to 关联(与 :class_name) returns nil

ruby-on-rails - 无法使用everyize在ruby中运行cronjob

android - 使用 FCM 从 Rails api 向 Android 推送通知未发送通知?

ruby-on-rails - wkhtmltopdf 试图从 http 而不是文件加载

ruby-on-rails - 如何设置 rails Authenticity Token 以与多个域一起使用?

ruby - 如何将两周添加到 Time.now?