gpt4 book ai didi

ruby-on-rails - Rails 关联在 after_initialize 回调中为 nil

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

我有一个名为 Purchase 的模型,其中包含一个名为 tickets 和 amount 的字段。这个模型属于Event,是有价格的。我想在创建新 Purchase 后调用 update_amount 回调,但在回调方法中关联的事件似乎不存在。

class Purchase < ActiveRecord::Base
belongs_to :event
attr_accessible :event_id, :tickets, :amount
delegate :price, to: :event
after_initialize :update_amount
...
def update_amount
update_attribute :amount, self.tickets * self.price
end
end

class Event < ActiveRecord::Base
attr_accessible :price
...
end

不过,当我对其进行测试时,我遇到了以下问题:

$ Purchase.new(tickets: 2, event_id: 1541)  
RuntimeError: Purchase#price delegated to event.price, but event is nil: <Purchase
id: nil, user_id: nil, event_id: nil, amount: nil, tickets: 1,
event_date: nil, created_at: nil, updated_at: nil, checkout_id: nil,
checkout_uri: nil, state: "incomplete">

请注意,系统中有一个 ID 为 1541 的事件,但 ActiveRecord 无法访问它?我在没有委托(delegate)的情况下尝试了同样的事情,使用 event.price,同样的事情发生了,即 got a price is not found for NilClass 错误。

有谁能帮我解释一下吗? after_initialize block 中没有形成关联吗?我忽略了什么吗?


PS:我最后在回调中添加了一个守卫,这样如果事件为零,它就不会被调用。不过,这只是一个 hack,如果能找到这个问题的根源,那就太好了。

最佳答案

http://edgeguides.rubyonrails.org/active_record_callbacks.html#after-initialize-and-after-find

after_initialize 类似于 Ruby 对象的构造函数 -- 在将任何数据库信息加载到该对象之前调用它。

您可能需要一个 :before_save 回调来根据门票和价格设置金额。本质上,“在我拯救自己之前,根据我当前的票数和这些票的价格重新计算我的金额。然后,将我写入数据库。”

关于ruby-on-rails - Rails 关联在 after_initialize 回调中为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11992928/

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