【问题标题】:Rails - counting instances where boolean is trueRails - 计算 boolean 为 true 的实例
【发布时间】:2015-10-03 00:27:10
【问题描述】:

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

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

Projects has many project invitations
Project invitations belong to projects

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

第一部分工作正常。对于接受,我的 project_invitation 表中有一个名为 :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>

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

http://stackoverflow.com/questions/32916133/rails-how-to-show-attribute-of-an-associated-model

http://stackoverflow.com/questions/32898541/rails-how-to-show-attributes-from-a-parent-object

谁能看到我做错了什么?

【问题讨论】:

    标签: ruby-on-rails associations


    【解决方案1】:

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

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

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

    您收到undefined method 'student_accepted' for #&lt;ActiveRecord::Associations::CollectionProxy []&gt; 错误的原因是您在ActiveRecord::Associations::CollectionProxy 上调用student_accepted,这是rails 创建的用于定义记录集合的对象。

    如果您想迭代该集合,您可以这样做:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 从技术上讲,它返回一个ActiveRecord::Associations::CollectionProxy 的实例,因此是错误消息。很多情况下可以看成一个数组,可以用to_a转换成数组,但不是Array对象。
      • 对。虽然ActiveRecord::Associations::CollectionProxyArray 共享一些方法名称,但它们并不相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      相关资源
      最近更新 更多