3

以下是我的联想...

Account has_many :credits
Credit belongs_to :account

我正在尝试运行:account.credits.current

所以,在那种情况下,我已经有了一个Account对象,然后我想访问模型中的一个current方法Credit

这是那个方法...

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

问题出在第二行……如果找不到,应该创建一个新的信用分录。具体来说,我无法设置它应该关联的帐户。我只是得到一个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].currentaccount.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 回答