如果满足一定条件,Rails属于关系

时间:2013-11-21 15:46:12

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord has-many belongs-to

我有一个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时,它仍然是零。

我该如何解决这个问题?谢谢。

3 个答案:

答案 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