gpt4 book ai didi

ruby-on-rails - rails has_many 和访问类内部

转载 作者:数据小太阳 更新时间:2023-10-29 08:29:32 26 4
gpt4 key购买 nike

我有一个 Rails 模型类

class Model <  ActiveRecord::Base

has_many :object_collection


def add_object(object)
object_collection.push object // works
@object_collection.push object // does not work
self.object_collection.push object // works
end
end

我想知道是否有人可以向我解释为什么 @ 不起作用但 self 我认为这两个意思相同吗

干杯

最佳答案

它们不一样。考虑以下 Ruby 代码:

class Person
attr_accessor :employer
end
john = Person.new
john.employer = "ACME"
john.employer # equals "ACME"

attr_accessor 方法可以方便地为您生成属性读取器和写入器(employer=employer)。您可以使用这些方法来读写存储在实例变量 @employer 中的属性。

现在,我们可以将上面的代码重写为以下代码,其功能与上面的代码相同:

class Person
def employer=(new_employer)
@works_for = new_employer
end
def employer
@works_for
end
end
john = Person.new
john.employer = "ACME"
john.employer # equals "ACME"

现在,不再使用实例变量@employer。我们选择手动编写访问器,并可以自由地为实例变量选择不同的名称。在此特定示例中,实例变量的名称与属性访问器的名称不同。没有什么可以阻止您这样做。

这类似于 ActiveRecord 在内部存储其属性的方式。它们未存储在同名的实例变量中,这就是为什么您对 @object_collectionpush 调用不起作用。

正如您可能理解的那样,属性读取器和写入器提供了某种抽象,可以对您隐藏实现细节。因此,直接在子类中读写实例变量通常被认为是不好的做法。

关于ruby-on-rails - rails has_many 和访问类内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1029373/

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