【发布时间】:2018-02-27 17:44:10
【问题描述】:
所以我正在尝试创建一个复杂的 (imo) CSV/Excel 导入过程,该过程必须为 3 个单独的模型 + 关联创建记录,并且在调试此过程的验证时,我偶然发现了一个关于 @ 的令人困惑的概念当传递的属性为 nil 时为 987654322@。
根据Rails API Docs,find_or_initialize_by()应该做到以下几点:
# File activerecord/lib/active_record/relation.rb, line 222
def find_or_initialize_by(attributes, &block)
find_by(attributes) || new(attributes, &block)
end
这让我相信,如果我将属性传递给 find_by,它们是 nil 甚至是 blank,那么它应该将其移动到 Model.new(nil) ,但是,对我来说,它一直返回该模型的最后一条记录。
Model.find_by() 和Model.where().find_or_initialize 等方法在通过nil, {}, false, "" 时仍然返回最后一条记录。
我希望它使用nil 属性初始化new 记录的原因是它无法通过验证并向用户抛出错误,即在该行中输入的数据无效。 (由于这不是标准的columns = model attributes 导入类型,我必须通过另一种方法解析传递的列,如果条目的一部分不好,该方法应该返回nil......至少这是我能想到的最好方法的。)
那么任何人都可以帮助我理解为什么这不起作用,正如我所解释的那样,在这种情况下你的建议可能是什么?
谢谢!
【问题讨论】:
标签: ruby-on-rails ruby csv ruby-on-rails-5