2015-10-09 3 views
1

Я пытаюсь сделать приложение с Rails 4.Rails - Как написать сумму двух атрибутов модели

У меня есть 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 

Я пытаюсь подсчитать, сколько студентов участвуют в проекте. Они могут быть приглашены или выразить интерес (если не приглашены).

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

В project.rb, у меня есть:

def self.students_participating 

     ProjectStudentEoi.interested_students.sum. 
ProjectInvitation.invitations_accepted 
    end 

Примечание: Я только разделить эту строку на две строки, потому что ТАК не будет отступа так долго линию. Это всего лишь одна строка в моем коде.

В моем 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 

Опять же, приведенный выше код разделен на 2 строки в этой должности, так как SO не будет отступать от него в качестве кода, когда это будет долго.

Тогда в моих проектах просмотра папки, у меня есть частичный, который имеет:

<%= @project.students_participating %> students participating 

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

Как вы пишете сумму двух методов подсчета в рельсах?

Я попробовал пример, приведенный в ответ ниже - так в моем 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 []> 

подхватывая предложения Мейера ниже, я попытался переписать мои методы класса как области, так и в ProjectStudentEoi.rb, у меня есть:

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

в ProjectInvitation.r б у меня есть

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

Тогда в project.rb (адаптируя предложение Мейера), у меня есть:

def students_participating 

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

У меня нет функции подсчета в дочерние объекты больше.

Когда я пытаюсь это, я получаю эту ошибку:

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

ТОГДА - с пересмотренным предложением Мейера, я попробовал:

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 []> 

ответ

0

Вы хотите число, а не список объектов. Таким образом, вы нарушаете сферу действия. Вместо этого ваш метод должен быть просто методом экземпляра. Из-за этого вы можете просто вызвать отношения вашего объекта проекта. И, наконец, мы имеем + вычислить сумму двух чисел :-)

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

Вы также должны прочитать Rails guides about scopes здесь. области могут быть выражены как методы класса, и вы это сделали. Это нормально, но вам нужно знать, когда это делать, и когда использовать обычные методы экземпляра.

+0

так что мне не нужны методы подсчета - это два дочерних объекта? – Mel

+0

Hi Meier, я пробовал это, но это не сработало. Вы уверены, что мне сначала не нужно делать счет? – Mel

+0

так интересно_студенты уже подсчитывают. invitations_accepted не учитывает, вам нужно добавить счет к этому. – Meier

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