Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 链接ActiveRecord::Associations记录时遇到问题_Ruby On Rails_Activerecord_Associations - Fatal编程技术网

Ruby on rails 链接ActiveRecord::Associations记录时遇到问题

Ruby on rails 链接ActiveRecord::Associations记录时遇到问题,ruby-on-rails,activerecord,associations,Ruby On Rails,Activerecord,Associations,我试图为每个用户检索一个名为“contribution\u amount”的关联列,但我遇到了未定义的方法错误,我无法找出原因 控制器具有: @payments = Payment.where(:contribution_date => Date.today).pluck(:user_id) @users = User.where(:id => @payments).find_each do |user| user.payments.contribution_amount e

我试图为每个用户检索一个名为“contribution\u amount”的关联列,但我遇到了未定义的方法错误,我无法找出原因

控制器具有:

@payments = Payment.where(:contribution_date => Date.today).pluck(:user_id) 
@users = User.where(:id => @payments).find_each do |user|
   user.payments.contribution_amount
end
模型包括:

class User < ActiveRecord::Base
   has_many :payments
end

class Payment < ActiveRecord::Base
    belongs_to :user
end
class用户
控制台中的确切错误是

`undefined method `contribution_amount' for #<ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Payment:0x007fb89b6b2c08>`
未定义的方法“供款金额”#`

用户。支付
是一个范围;也就是说,它表示
付款
记录的集合。
供款金额
方法仅适用于个人
付款
记录。你可以说
user.payments.first.contribution\u amount
,但我不确定这是你的目标

您是否正在尝试合计供款金额?在这种情况下,您可能希望使用一种聚合记录集合的方法:
user.payments.sum(:contribution\u amount)

暂时偏离主题,通常最好将作用域方法向下推到模型中。例如:

class User < ActiveRecord::Base
  def self.with_payment_contribution_after(date)
    joins(:payments).merge(Payment.with_contribution_after(date))
  end

  def self.with_contribution_amount
    joins(:payments).group("users.id")
      .select("users.*, sum(payments.contribution_amount) as contribution_amount")
  end
end

class Payment < ActiveRecord::Base
  def self.with_contribution_after(date)
    where(:contribution_date => date)
  end
end

# In your controller
@users = User.with_payment_contribution_after(Date.today)
  .with_contribution_amount


# In a view somewhere
@users.first.contribution_amount
class用户日期)
结束
结束
#在控制器中
@用户=用户。在(日期。今天)之后支付
.有_贡献_金额
#在某处的视野中
@用户。第一。供款金额
以这种方式构建代码的优点是:

  • 您的作用域不再被锁定在控制器方法中,因此您可以在其他地方轻松地重用它们

  • 控制器方法可以变得更简单、更具声明性。也就是说,它可以表达它想要什么信息,而不是如何获取这些信息

  • 将作用域分解为更小的部分意味着我们的代码被更好地分解,并且已经分解的代码可以被重新组合

  • 通过模型单元测试测试作用域比通过控制器测试更容易


  • 接下来是一些额外的信息。我正在尝试获取每个用户在特定日期到期付款的供款金额。顺便说一句,感谢您提出的将作用域方法移动到模型中的建议。