【问题标题】:build method on ruby on rails在 ruby​​ on rails 上构建方法
【发布时间】:2013-11-04 04:43:04
【问题描述】:

Rails 新手,我正在关注使用 Rails 3.1 进行敏捷 Web 开发中的 Depot 项目。一切都很好,直到当本书使用“构建”方法时我迷路了。

@cart = current_cart
product = Product.find(params[:product_id])
@line_item = @cart.line_items.build(product: product)

我的 google 搜索让我了解到 .build 方法只是在表中创建行的一种更简洁的方法(具有表之间的关联)。但是在上面的代码中,我希望代码看起来像这样:

@line_item = @cart.line_items.build(product_id => params[:product_id])

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

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1 associations


    【解决方案1】:

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

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

    对于你的第二个问题,是的,你的 id 作曲方式也可以。但更好的方法是不信任 param。相反,首先通过在 db 中查找来验证它。

    【讨论】:

    • 我喜欢你的回答,虽然 nzifnab 有同样的答案,但你的建议让我成为了一个更好的开发者:)
    • 通过关联进行时不需要构建吗?与新的完全不同
    • 为了澄清 - 在当前的 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 略有不同。但是,由于它们在两个类中都有别名,因此使用 buildnew 无关紧要。
    • 构建几乎就像新的一样,但也有边缘情况。特别是对于“has_one”关系,如果已经存在“has_one :thing”相关,obj.build_thing可以删除或取消现有相关项的外键。请参阅:stackoverflow.com/questions/53212840/…
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多