gpt4 book ai didi

ruby-on-rails - ActiveRecord:将 has_many 列表视为一个简单的数组

转载 作者:行者123 更新时间:2023-12-04 03:42:05 25 4
gpt4 key购买 nike

考虑这个简单的 :has_many 关系:

class Basket < ActiveRecord::Base
has_many :apples
...
end

class Apple < ActiveRecord::Base
belongs_to :basket
end

现在,我在 Basket 类中有一个方法,我想在其中创建“apples”数组的临时副本并操作临时副本。首先,我想向临时副本添加一个新元素,如下所示:
class Basket < ActiveRecord::Base
has_many :apples

def do_something
#create a temporary working copy of the apples array
temp_array = self.apples

#create a new Apple object to insert in the temporary array
temp_apple = Apple.new

#add to my temporary array only
temp_array << temp_apple

#Problem! temp_apple.validate gets called but I don't want it to.
end
end

当我这样做时,我发现当我尝试将它添加到我的临时数组时,会在临时 Apple 对象上调用验证例程。我创建临时数组的全部原因是为了避免主数组附带的所有行为,例如验证、数据库插入等......

也就是说,我确实找到了一种蛮力方法来避免这个问题,即在 for 循环中一次创建一个对象的 temp_array ,如下所示。这有效,但很丑陋。我想知道是否有更优雅的方式来实现这一点。
class Basket < ActiveRecord::Base
has_many :apples

def do_something
#create a temporary working copy of the apples array
temp_array = []
for x in self.apples
temp_array << x
end

#create a new Apple object to insert in the temporary array
temp_apple = Apple.new

#add to my temporary array only
temp_array << temp_apple

#Yippee! the temp_apple.validate routine doesn't get called this time!.
end
end

如果有人对这个问题有比我所听到的更好的解决方案,我很乐意听到。

谢谢!

最佳答案

问题是 self.apples 实际上不是一个数组——它是一个关系,一旦你对它应用了一个数组/枚举方法,就会解决这个问题。所以,在此之后: temp_array = self.apples 甚至 SQL 查询都没有被触发。

强制获取数据并摆脱所有 Relation 行为的简单解决方案就是使用方法 all :

#create a temporary working copy of the apples array
temp_array = self.apples.all

关于ruby-on-rails - ActiveRecord:将 has_many 列表视为一个简单的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9019393/

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