以下是我的协会......
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'
错误。
答案 0 :(得分:1)
通过关联创建,而忽略account_id
,因为它会自动链接:
current = self.create(:for_date => Time.now.strftime("%Y-%m-01")) if current.blank?
注意:self.create
代替Credit.create
。
答案 1 :(得分:0)
您尝试在类方法中访问实例属性,这是不可能的。
如果你有这个:
class Credit
def self.current
self.account
end
end
它与:Credit.account
相同,我相信你不会理解它。
现在,如果您希望它加载多个关联,那么您的方法current
必须是一个类方法:ie:
使用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
如果你想做一个方便的方法,我会这样做:
班级学分 def self.current_or_new self.current || self.create(:for_date => Time.now.strftime(“%Y-%m-01”)) 结束 端
这应该按照你想要的方式工作。如果通过关联调用,即:
account.credits.current_or_new
然后,通过关联,rails将为您输入account_id。