2012-01-26 44 views
0

我有一個模型(讓我們稱之爲A)在Rails項目中檢查一個屬性(讓我們稱之爲)與ActiveRecord ::髒a_changed?函數before_save。我希望能夠在Rake任務中保存A的實例,但僅包括:environment並未削減它 - 我在Rake任務中獲得了「A方法中沒有定義a_changed?」消息。如何讓ActiveRecord記住Rake任務中的ActiveRecord :: Dirty?ActiveRecord ::髒和耙

Rails的版本是2.3.11

namespace :some_namespace do 
    namespace :some_subnamespace do 
    desc "This is a Rake Task" 
    task :some_taskname, [:some_arg] => [:environment] do |t,arg| 
     foo = A.find(11111) 
     foo.save #<=== fails with "no method a_changed? defined on A" 
    end 
    end 
end 

因爲這是一個非常密集的一堆信息的,這裏的崩潰:

  1. 我有一個模型中的帶有屬性的。
  2. 模型A定義了一個before_save觸發器,它調用a_changed?,這是Rails環境中由ActiveRecord :: Dirty添加的方法。從控制器調用這個函數沒有任何問題。
  3. 但是在我的Rake任務中,a_changed?調用before_save觸發器會引發NoMethodError異常,可能是因爲[:environment]要求不足以包含ActiveRecord :: Dirty。我的問題是如何使這不會發生(我的解決方法是從before_save中解救NoMethodError,這是一個明顯的黑客攻擊)。

回答

0

看起來像你的問題有already been answered on a previous question asked on StackOverflow

爲了確定你的對象有,你可以做到這一點什麼方法:

... 
desc "This is a Rake Task" 
task :some_taskname, [:some_arg] => :environment do |t, args| 
    foo = A.find(11111) 
    p foo.methods 
... 

這將打印出的可用方法的列表。如果數組包含:some_attr_changed?(其中some_attr是一個屬性),那麼您可以確定ActiveRecord :: Dirty在rake任務中確實工作正常。如果這些方法沒有出現在數組中,那麼你的假設是正確的。

+0

這與我所要求的無關。傳遞參數很容易。它正在訪問blah_changed? ActiveRecord ::我的模型實例的髒方法,我無法做到。我會看看我能否澄清這個問題。 –

+0

對不起,這不是你要找的東西,但你最初的問題使得它看起來像訪問語法時遇到了問題。這就是說,沒有必要降低我的迴應。只試圖幫助。另外,如果你嘗試在你的任務中添加一行,就像這樣:'p A.ancestors',你會發現這個類確實繼承自'ActiveRecord :: AttributeMethods :: Dirty'和'ActiveModel :: Dirty',所以顯然它正在繼承這些模塊的方法。我試圖幫助。我只是嘗試了你在這裏的同一個案例,它對我來說工作得很好。 – Batkins

+0

請參閱上面編輯的答案。 – Batkins