我有一个rails应用程序,学生可以在其中申请雇主发布的项目。我有一个学生has_many项目,一个项目belongs_to学生。问题是项目可以在学生被选中之前存在很长时间。我的意思是,在雇主按下视图中的雇用按钮之前,项目的student_id为零。一旦雇主按下“雇用”按钮,我就会尝试将项目的student_id设置给雇用的学生。出于某种原因,我不能这样做。这是项目模型:
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 :(得分:0)
您已正确设置关联。
如果Project#change_it中发生错误,那么我怀疑
self.relationships.where(:state => :active).first
没有回复关系。
答案 1 :(得分:0)
我认为你想引入一个额外的模型来捕捉学生和项目之间的关系。也许重述这个问题将有助于澄清这一点。
第一点表明该项目属于教授(不是学生)。从第二点和第三点开始,我倾向于说学生对项目有任务,而且作业可能已经“申请”,“已批准”和“拒绝”。考虑到这一点,我可能会以这种方式建模(使用state_machine gem):
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
答案 2 :(得分: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