gpt4 book ai didi

ruby-on-rails-3 - 导轨 :has_many explanation

转载 作者:行者123 更新时间:2023-12-04 07:18:29 25 4
gpt4 key购买 nike

试图了解 :has_many 的影响正如它在敏捷 Web 开发书第 4 版中所介绍的那样

为购物车设置以下关系

class Cart < ActiveRecord::Base
has_many :line_items, :dependent => :destroy
end

这恭维了相关的 LineItem类(class)
class LineItem < ActiveRecord::Base
belongs_to :product
belongs_to :cart
end

一切都很好,我完全理解关系建模,只是试图接受它只是“有效”。然而,作者在代码中,并没有使用 LineItem.find在底层表上进行搜索的方法,使用 line_items对象,例如
current_item = line_items.where(:product_id => product_id).first

有人可以解释一下,最终我想象一下, :has_many 的效果如何?方法调用实际上是什么?什么是 line_items对象,它来自哪里?我想同样的问题将适用于其他关系 Rails 方法的效果。

谢谢。'

最佳答案

将我的回答视为对 Chris Kimpton 回答的重要评论。

首先,您应该阅读 API documentation ,其中的关联解释得很好。

简而言之,当你调用方法has_many在类的代码中(请记住,在 Ruby 中,每一行都是已执行的代码,因此 has_many :something 只是对某个现有方法的调用)然后该方法定义了另外两个与您传递的参数同名的方法。

在这种情况下,这将是符号 :line_items ,所以 has_many方法大致相当于:def line_items(force_reload = false)def line_items=(objects) .

新创建的方法 line_items返回由 WHERE cart_id = #{self.id} 过滤的所有 LineItem 对象的集合对象(这是一个简化的例子)。

该集合对象的工作方式类似于 Array,但它还响应更多方法(如 findbuild ),帮助您管理 Cart 对象和 LineItem 之间的关系。

所以,该行:

line_items.where(:product_id => some_id).first

相当于:
LineItem.where(:cart_id => self.id).where(:product_id => some_id).first

使用第一种方法( line_items 集合),您无需记住添加 :cart_id => self.id对每一个陈述。

关于ruby-on-rails-3 - 导轨 :has_many explanation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7344176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com