【问题标题】:Rails 4, Sum value for nested attributeRails 4,嵌套属性的总和值
【发布时间】:2016-01-04 04:43:50
【问题描述】:

您好,我有如下嵌套的属性模型,

Model Parent
has_many :students
has_many :classinos, through: :students
accepts_nested_attributes_for :students, :reject_if => lambda { |a| a[:firstname].blank?}, :allow_destroy => true

Model Student
belongs_to :Parents, for
has_many :classinfos, :dependent => :destroy
has_many :classlists, :through => :classinfos
accepts_nested_attributes_for :classinfos, :reject_if => lambda { |a| a[:classlist_id].blank?}, :allow_destroy => true

Model Classinfo
belongs_to :student, foreign_key: :student_id
belongs_to :classlist, foreign_key: :classlist_id

Model Classlist
has_many :students, :through => :classinfos
has_many :classinfos

这种关系就像... Parent(计算学费) > Classlist(:tuition)

Model Classlist有一个栏目叫“tuition”,我想把学生的所有学费汇总起来,在Parents模型中计算。

目前为止……

Model Classinfo
def tuitioncount
Classlist.where(:id => self.classlist_id).sum(:tuition)
end

我可以通过

显示学生的学费
<% @student.classinfos.order(classlist_id: :asc).each do |classinfo| %>
<%= classinfo.tuitioncount%>
<%end%>

但我不知道如何总结它们并在 Model Parent 中定义一个方法。 我需要类似...

Model Parent
def balance
Classlist.where(:id => self.students.classinfos.classlist_id).sum(:tuition)
(or)
Student.where(:member_id => self.id).sum("student.tuitioncount")
end

请帮助我,我真的不知道如何从非常远的嵌套模型中提取值...

【问题讨论】:

  • 一种方法是Student.where(:member_id =&gt; self.id).to_a.sum { |student| student.tuitioncount } .. 但我认为可以进行1个查询来解决这个问题。

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

如果我正确地遵循了你的联想,就像这样。

class Parent
  has_many :students
  has_many :classinfos, through: :students
  has_many :classlists, through: :classinfos

  def balance
    self.classlists.sum(:tuition)
  end
end

注意:在 Rails 3.1 中添加了对这种深度嵌套关联样式的支持,因此早期版本需要不同的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多