2012-01-26 11 views
0

RailsプロジェクトでActiveRecord :: Dirty a_changedを使用して属性をチェックするモデル(Aと呼ぶ)を持っていますか? before_saveの関数。私は、AのインスタンスをRakeタスクに保存できるようにしたいが、単純に以下を含む:環境はそれを切断しない - 私はRakeタスクの "Aメソッドで定義されたメソッドなし"を取得している。 Rakeタスク内のActiveRecord :: DirtyについてActiveRecordに覚えさせるにはどうすればよいですか?ActiveRecord :: Dirty and Rake

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. 私は、属性AとモデルAを持っています。
  2. モデルAには、a_changed?を呼び出すbefore_saveトリガが定義されています。これは、Rails環境でActiveRecord :: Dirtyによって追加されるメソッドです。コントローラからこれを呼び出す際に問題はありません。
  3. しかし、私のレーキタスクでは、a_changed?おそらく[:environment]要件がActiveRecord :: Dirtyをインクルードするのに十分でないため、before_saveトリガーを呼び出すとNoMethodError例外が発生します。私の質問は、これを起こさないようにする方法です(私の回避策は、明らかなハックである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が実際にレーキタスクで正常に動作していることがわかります。これらのメソッドが配列に表示されない場合は、前提条件が正しいといえます。

+0

これは私が求めているところにはどこにもありません。引数を渡すのは簡単です。それはblah_changedにアクセスしていますか?私ができないモデルインスタンスのActiveRecord :: Dirtyメソッド。質問を明確にすることができるかどうかがわかります。 –

+0

これはあなたが探しているものではありませんでしたが、元の質問では構文にアクセスするのが難しいようでした。それは言われている、私の応答をdownvoteする必要はありません。ただ助けようとしています。また、 'pAndancestors'のような行をタスクに追加しようとすると、クラスが' ActiveRecord :: AttributeMethods :: Dirty'と 'ActiveModel :: Dirty'を継承していることがわかります。明らかに、これらのモジュールからメソッドを継承しています。私は助けになろうとしていた。私はちょうどあなたがここにいる同じ事件を試みたが、それは私のためにうまくいった。 – Batkins

+0

上記の編集済みの回答をご覧ください。 – Batkins