根据我的经验,覆盖来自ActiveRecord::Base
的默认属性获取者/设置者是一种危险的做法 - 有龙。我会用例子来解释哪一个让我失望。
我使用this answer中建议的super || create_association
模式。你可以用这样一个棘手的错误结束:
From: /Users/mec/Sites/zipmark/service/spec/models/vendor_application_spec.rb @ line 39 :
34: subject.read_attribute(:ledger_id).should be_blank
35: end
36:
37: it "lazily creates the association" do
38: subject.ledger
=> 39: binding.pry
40: subject.reload.ledger_id.should be_present
41: end
42: end
43: end
44:
[1] pry(#<RSpec::Core::ExampleGroup>)> subject.ledger
#<Ledger:0x007fc3c30ad398> {
:id => "cf0ac70e-ce23-4648-bf3f-85f56fdb123a",
:created_at => Wed, 30 Sep 2015 17:56:18 UTC +00:00,
:updated_at => Wed, 30 Sep 2015 17:56:18 UTC +00:00,
:description => "Freshbooks Ledger"
}
[2] pry(#<RSpec::Core::ExampleGroup>)> subject.reload.ledger_id
nil
我被错误地期待Rails的魔法更新在手边(self
)记录,其新建的ledger
纪录。最后我重新写我的重载#ledger
方法如下:
def ledger
super || begin
ledger = create_ledger(description: "#{name} Ledger")
update_column(:ledger_id, ledger.id)
ledger
end
end
这是行不通的,因为我在那里有很多猫的对象已经创建了一个情况是,我不希望有每当我引用它时,都要检查是否存在所有者关联。 –
明白了。添加了另一个选项,并对原始解决方案做了一个小改动 –
试过了你的第二个解决方案,这似乎也没有工作。没有超类方法'拥有者'为#' –