2015-10-03 2 views
0

Я пытаюсь сделать приложение с Rails 4.Rails - примеры подсчета, где логическое значение ИСТИНА

У меня есть модель проекта и модель приглашения проекта.

Projects has many project invitations 
Project invitations belong to projects 

В моем проекте показывают, Im пытаясь подсчитать, сколько приглашений было отправлено и сколько было принято.

Первая часть работает нормально. Для акцептов у меня есть атрибут в моей таблице 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> 

Im изо всех сил, чтобы понять, как ссылаться на атрибуты, хотя дельс. Я прочитал несколько книг, но все они берут фоновые знания. У меня был полезный вклад в смежные вопросы (см. Ниже), но я все еще не понимаю концепцию.

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 

Может ли кто-нибудь увидеть, что я сделал не так?

ответ

2

Вы можете найти количество приглашений, что студенты приняли с:

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

Rails объясняет Active Record Query Interface guide игровых, как это работает.

Причина, по которой вы получили ошибку undefined method 'student_accepted' for #<ActiveRecord::Associations::CollectionProxy []>, состоит в том, что вы вызывали student_accepted на ActiveRecord::Associations::CollectionProxy, который создает рельсы объекта для определения коллекции записей.

Если вы хотите перебрать эту коллекцию вы можете сделать:

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

Это необходимо потому, что проект имеет много приглашений.

1

@project.project_invitations дает вам массив, а класс Array не имеет метода student_accepted (в то время как каждый элемент массива имеет этот метод).

Вы можете использовать @project.project_invitations.select{|item| item.student_accepted == true}.present? в качестве условия.

+0

Технически он возвращает экземпляр [ActiveRecord :: Associations :: CollectionProxy] (http://apidock.com/rails/ActiveRecord/Associations/CollectionProxy), поэтому сообщение об ошибке. Во многих случаях его можно рассматривать как массив, и его можно преобразовать в массив с 'to_a', но это не объект' Array'. – ihaztehcodez

+0

Справа. В то время как 'ActiveRecord :: Associations :: CollectionProxy' совместно используют некоторые имена методов с' Array', они не совпадают. – wesley6j

Смежные вопросы