gpt4 book ai didi

ruby-on-rails-3 - Rails 插入数组保存对象

转载 作者:行者123 更新时间:2023-12-04 01:33:58 24 4
gpt4 key购买 nike

我有一个有趣的问题。我使用的是 Ruby 1.9.2 和 Rails 3.1.3。

我有 2 个模型,为了简单起见,假设客户和商店。
商店有很多顾客,一个顾客属于一个商店。
我正在尝试为一家商店收集所有客户,并为更多客户创建一个地方,以便我稍后可以填充值。相反,customer.save 在我不期望的时候被调用。

store = Store.find(1)
customers_array = store.customers
random_array = Array.new
customers_count = customers_array.count + 1

(customers_count..2).each do |i|
customer = Customer.new
c.id = "#{i}000000000000"
random_array << customer # this line doesn't call customer.save
customers_array << customer # this line calls customer.save when store has customers
end

出于某种原因,当客户被插入数组时,会调用 customer.save。
如果您推送到一个数组是一个普通数组而不是一个关系,则不会发生这种情况。

我找到了一种解决方法,但我仍然想知道为什么会发生这种情况。
解决方法:
store = Store.find(1)
initial_customers_array = store.customers
additional_customers_array = Array.new
customers_count = initial_customers_array.count + 1

(customers_count..2).each do |i|
customer = Customer.new
c.id = "#{i}000000000000"
additional_customers_array << customer
end
customers_array = initial_customers_array + additional_customers_array

最佳答案

<<push 的别名

  • http://apidock.com/rails/ActiveRecord/Associations/CollectionProxy/%3C%3C
  • http://apidock.com/rails/ActiveRecord/Associations/CollectionProxy/push

  • 其中在 ActiveRecord::Associations::CollectionProxy电话 concat
  • http://apidock.com/rails/ActiveRecord/Associations/CollectionAssociation/concat (查看方法源码)
  • https://github.com/rails/rails/blob/master/activerecord/lib/active_record/associations/collection_proxy.rb#L283

  • 其中调用 concat_records
  • http://apidock.com/rails/v3.2.3/ActiveRecord/Associations/CollectionAssociation/concat_records

  • 您可以在其中看到插入的位置。

    因此,使用现有记录(保存在数据库中),运行 <<.push将记录插入到集合中,必要时将它们持久化到数据库中。调用 <<在数组上,而不是记录集合上,就像你在做的那样
    random_array << customer

    调用 Ruby 的 << Array 方法,而不是 AR 等效方法(如您所见,在这种情况下不会进行保存)。

    编辑:需要明确的是,您找到的解决方法或多或少是我通常处理您正在处理的情况的方式;我的回答更侧重于原因 <<有这种行为。

    关于ruby-on-rails-3 - Rails 插入数组保存对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11043096/

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