Rails - 如何写两个模型属性的总和

时间:2015-10-09 22:14:06

标签: ruby-on-rails sum

我正在尝试使用Rails 4制作应用程序。

我有3个模特。

Project.rb
ProjectInvitation.rb
ProjectStudentEoi.rb

协会是:

Project has may project_invitations
Project has many project_student_eois

ProjectInvitation belongs to project
ProjectStudentEoi belongs to project

我正在计算参加项目的学生人数。他们可以被邀请或表达兴趣(如果没有邀请)。

在我的project.rb中,我尝试编写一种方法来总结已接受的邀请或已批准的感兴趣表达的数量。

在project.rb中,我有:

  def self.students_participating

       ProjectStudentEoi.interested_students.sum.
ProjectInvitation.invitations_accepted
  end

注意:我只将上面一行分成两行,因为SO不会缩进这一行。这是我代码中的一条连续线。

在我的projectInvitation.rb中,我有:

def self.invitations_accepted
    @project.project_invitations.where(student_accepted: true)
  end

在我的ProjectStudentEoi.rb中,我有:

    def self.interested_students
        @project.project_student_eoi.where
(creator_accepted: true).count
    end

同样,上面的代码在这篇文章中分为两行,因为当它很长时,SO不会将它作为代码缩进。

然后在我的项目视图文件夹中,我有一个部分,其中包含:

<%= @project.students_participating %> students participating 

NoMethodError at /projects/2
undefined method `students_participating' for #<Project:0x007ff733333830>

如何在rails中编写两种计数方法的总和?

我尝试了下面答案中给出的示例 - 所以在我的Project.rb中:

def students_participating
   project_student_eois.interested_students.sum + 
   project_invitations.invitations_accepted
  end

我收到此错误:

NoMethodError at /projects/2
undefined method `interested_students' for #<ActiveRecord::Associations::CollectionProxy []>

接下来Meier的建议,我尝试将我的类方法重写为范围,所以在ProjectStudentEoi.rb中,我有:

  scope :creator_accepted, lambda { where(creator_accepted: true)}

在ProjectInvitation.rb中我有

scope :student_accepted, lambda { where(student_accepted: true)}

然后在project.rb(改编Meier的建议)中,我有:

def students_participating

    project_student_eois.creator_accepted.count + 
    project_invitations.students_accepted.count
  end

我不再在子对象中使用count函数了。

当我尝试这个时,我收到了这个错误:

NoMethodError at /projects/2
undefined method `creator_accepted' for #<ActiveRecord::Associations::CollectionProxy []>

然后 - 采取Meier的修改建议,我试过:

 def students_participating

    project_student_eois.creator_accepted + 
    project_invitations.students_accepted.count
  end

我收到此错误:

NoMethodError at /projects/2
undefined method `creator_accepted' for #<ActiveRecord::Associations::CollectionProxy []>

1 个答案:

答案 0 :(得分:0)

您想要一个数字,而不是对象列表。所以你打破了范围链。相反,您的方法应该只是一个实例方法。因此,您可以简单地调用项目对象的关系。最后我们有+来计算两个数字的总和: - )

class Project
  ....
  def students_participating
    project_student_eois.interested_students + 
      project_invitations.invitations_accepted.count
  end

您还应该在此处阅读Rails guides about scopes。范围可以表示为类方法,并且您已经完成了。没关系,但是您需要知道何时进行,以及何时使用常规实例方法。