0

У меня есть приложение для рельсов, в котором учащиеся могут подать заявку на проекты, опубликованные работодателями. У меня есть так, что у Студента есть несколько проектов, а Project принадлежит _ Student. Проблема в том, что проект может существовать в течение длительного времени, прежде чем студент будет выбран для него. Я имею в виду, что до тех пор, пока работодатель не нажмет кнопку проката в представлении, проект student_id равен нулю. Как только работодатель нажимает кнопку «нанять», я пытаюсь установить ученика проекта студенту, который был нанят. По какой-то причине я не могу этого сделать. Вот модель проекта:Rails принадлежит_от отношения, если соответствует определенному условию

class Project < ActiveRecord::Base 
     belongs_to :student 
     belongs_to :employer 
     has_many :relationships 

    def change_it 
     self.student_id = self.relationships.where(:state => :active).first.student_id 
     self.relationships.each do |relationship| 
      if relationship.state != :active 
      relationship.deny_applicants 
      end 
     end 
    end 
end 

При нажатии на кнопку проката, он принимает меня к следующей странице, как обычно, но когда я проверить student_id проекта в консоли, он по-прежнему равна нулю.

Как исправить это? Благодарю.

+0

Идеи кто-нибудь? Я работаю часами - все равно не могу заставить его работать. – Philip7899

ответ

0

Я думаю, что вы хотите ввести дополнительную модель для захвата отношений между Студентом и Проектом. Возможно, повторение проблемы поможет прояснить это.

  • Профессор может создать проект в любое время
  • Студент может подать заявление на получение проекта в любое время после того, как она была размещена
  • Профессор должен одобрить назначение Стьюдента к проекту

Первый пункт предполагает, что проект принадлежит профессору (а не ученику). Из второго и третьего пунктов я хотел бы сказать, что у Студента есть Присвоение Проекту и что Уступка может иметь «прикладные», «утвержденные» и «отклоненные» состояния. Имея это в виду, я бы, вероятно, модель это так (с state_machine драгоценный камень):

class Student < ARec 
    has_many :assignments 
    has_many :approved_assignments, class_name: 'Assignment', conditions: { state: 'approved' } 
end 

class Project < ARec 
    has_many :assignments 
    has_one :approved_assignment, class_name: 'Assignment', conditions: { state: 'approved' } 
end 

class Assignment < ARec 
    belongs_to :student 
    belongs_to :project 

    state_machine :state, initial: :applied do 
    state: :approved 
    state: :declined 

    event :approve do 
     transition all => :approved 
    end 

    event :decline do 
     transition all => :declined 
    end 
    end 
end 
+0

Я на самом деле уже использую драгоценный камень государственного устройства с проектами. Я думаю, вы натолкнулись на то, что я пытаюсь сделать, просто без дополнительных отношений. Теперь у меня есть то, что проект изначально находится на государственной регистрации. Когда студент нанимается, он переходит в состояние «actual_job». То, что я хочу, - это когда оно изменяется в состояние «actual_job», поскольку student_id становится связанным с правильным учеником. Любая идея, как это сделать? – Philip7899

+0

Извините, я забыл отношения - это в основном то же самое, что и Назначение, которое я предложил. Как вы вызываете Project # change_it? – AndyV

+0

Я использую это: 'after_transition: posting =>: actual_job,: do =>: change_it'. Я знаю, что он вызван, потому что deny_applicants работает. – Philip7899

0

У вас есть ассоциации, настроенные правильно.

Если ошибка происходит в Project # change_it, то я подозреваю,

self.relationships.where(:state => :active).first 

не возвращает отношения.

+0

Я не вижу, как это может быть. Ваш комментарий заставил меня переосмыслить вопрос, поэтому я обновил содержание с дополнительной информацией. – Philip7899

+0

Вы не показываете нам код, который создает отношения и присваивает student_id и project_id отношения. Когда это происходит в рабочем процессе, который вы описали? –

0

я, наконец, понял это. Просто установка нового значения для student_id не обновляла базу данных. Мне нужно было использовать update_attributes следующим образом:

def change_it 
    self.update_attributes(student_id: self.relationships.where(:state => :active).first.student_id) 

    self.relationships.each do |relationship| 
     if relationship.state != :active 
     relationship.deny_applicants 
     end 
    end 
end 
Смежные вопросы