3

これが私の協会です...

Account has_many :credits
Credit belongs_to :account

そして私は実行しようとしています:account.credits.current

したがって、その場合、私はすでにオブジェクトを持っているので、モデル内のメソッドAccountにアクセスしたいと思います。currentCredit

これがその方法です...

def self.current
   # Find current credit line
   current = self.where(:for_date => Time.now.strftime("%Y-%m-01")).first

   # If we couldn't find a credit line for this month, create one
   current = Credit.create(:account_id => self.account.id, :for_date => Time.now.strftime("%Y-%m-01")) if current.blank?

   # Return the object
   current
end

問題はその2行目にあります...クレジットエントリが見つからない場合は、新しいクレジットエントリを作成する必要があります。具体的には、どのアカウントに関連付けるかを設定できません。エラーが発生しますundefined method 'account'

4

2 に答える 2

1

代わりに関連付けを介して作成し、account_id自動的にリンクされるため、を省略します。

current = self.create(:for_date => Time.now.strftime("%Y-%m-01")) if current.blank?

注:self.createの代わりにCredit.create

于 2012-11-07T03:12:47.573 に答える
0

クラスメソッドでインスタンスプロパティにアクセスしようとしていますが、それは不可能です。

あなたがこれを持っているなら:

class Credit
   def self.current
      self.account
   end
end

それは次と同じです:Credit.account、あなたが理解していると確信しているように、それは機能しません。

ここでcurrent、複数形の関連付けにロードする場合は、メソッドをクラスメソッドにする必要があります。

あなたdef self.currentと電話することができますaccount.credits.current

あなたdef currentと電話することができますaccount.credits[0].currentまたはaccount.credits.where(...).current

これが理にかなっていることを願っています。さて、どうしたらいいのか…

私の推奨はcurrent、次のようなスコープを作成することです。

class Credit
  scope :current, lambda { where(:for_date => Time.now.strftime("%Y-%m-01")).first }
  ...
end

次に、このスコープをどこでも使用でき、その最後にインスタンス(またはnil)を置くことができます。

account.credits.create(...) unless accounts.credit.current

便利な方法を作成したい場合は、次のようにします。

class Credit def self.current_or_new self.current || self.create(:for_date => Time.now.strftime( "%Y-%m-01"))end end

これは、意図したとおりに機能するはずです。アソシエーションを介して呼び出された場合、つまり:

account.credits.current_or_new

次に、account_idは、アソシエーションを介してRailsで入力されます。

于 2012-11-07T03:53:14.607 に答える