Rails - 计算布尔值为真的实例

Rails - counting instances where boolean is true

我正在尝试使用 Rails 4.

制作一个应用程序

我有一个项目模型和一个项目邀请模型。

Projects has many project invitations
Project invitations belong to projects

在我的项目展示中,我正在计算已发送了多少邀请以及已接受了多少邀请。

第一部分工作正常。对于接受,我在我的 project_invitation table 中有一个名为:student_accepted 的属性。如果是真的,我要算记录

<%= @project.project_invitations.size %>
            <% if @project.project_invitations.student_accepted == true %>
                <%= @project.project_invitations.size %>
                <% else %>
                'No'
            <% end %>

它给出了这个错误:

undefined method `student_accepted' for #<ActiveRecord::Associations::CollectionProxy []>

我也试过:

<% if project.project_invitations.student_accepted == true %>

<%= project.project_invitations.size %>

它给出了这个错误:

undefined local variable or method `project' for #<#<Class:0x007fc01d9dcbe8>:0x007fc01de04248>

我很难理解如何通过关联模型引用属性。我读过几本书,但它们都假定有背景知识。我对相关问题(下方)提供了有用的意见,但仍然没有掌握这个概念。




谁能看出我做错了什么?

您可以找到学生接受的邀请数量:

@project.project_invitations.where(student_accepted: true).count

Rails 的 Active Record Query Interface guide 解释了它是如何工作的。

您收到 undefined method 'student_accepted' for #<ActiveRecord::Associations::CollectionProxy []> 错误的原因是因为您在 ActiveRecord::Associations::CollectionProxy 上调用 student_accepted,这是一个 rails 创建的对象,用于定义记录集合.

如果您想遍历该集合,您可以这样做:

<% @project.project_invitations.each do |invitation| %>
  # here you can call `invitation.student_accepted`
<% end %>

这是必要的,因为一个项目有很多个邀请。

@project.project_invitations 给你一个数组,数组 class 没有方法 student_accepted(而数组中的每个项目都有这个方法)。

您可以使用@project.project_invitations.select{|item| item.student_accepted == true}.present?作为条件。