我使用readonly?
函數標記我的Invoice
已發送後不可變;對於InvoiceLine
s,我只是將readonly?
函數代入Invoice
。繞過只讀?當保存ActiveRecord
一個簡單的例子:
class Invoice < ActiveRecord::Base
has_many :invoice_lines
def readonly?; self.invoice_sent? end
end
def InvoiceLine < ActiveRecord::Base
def readonly?; self.invoice.readonly? end
end
這個偉大的工程,只是在一個特定的情況下我想更新InvoiceLine
不管readonly?
屬性。
有沒有辦法做到這一點?
我試過使用save(validate: false)
,但這沒有效果。我看着在AR源persistence.rb
,這似乎只是做:
def create_or_update
raise ReadOnlyRecord if readonly?
...
end
是否有避免這種明顯的方法是什麼?
A(有點髒)的解決方法,我可能會在Python做:
original = line.readonly?
line.readonly? = lambda: false
line.save()
line.readonly? = original
但是,這並不在Ruby中工作,因爲功能不是第一類對象...
'Proc'和'lambda'是Ruby中的第一類,如果這可以幫助您解決「有點髒」的解決方法。雖然可能與Python有不同的屬性。 –
@EricPlaton問題是我不能分配給'line.readonly?'; 'line.readonly? = - > {}'是一個語法錯誤(由於'?',但即使沒有,我會調用'line.readonly ='方法,這與我想要的非常不同)。 – Carpetsmoker