关联问题创建

时间:2012-11-07 03:00:41

标签: ruby-on-rails ruby ruby-on-rails-3 associations

以下是我的协会......

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'错误。

2 个答案:

答案 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].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

如果你想做一个方便的方法,我会这样做:

班级学分      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。