【问题标题】:Rails belongs_to relationship if meets certain condition如果满足特定条件,Rails 的 belongs_to 关系
【发布时间】:2013-11-21 15:46:12
【问题描述】:

我有一个 Rails 应用程序,学生可以在其中申请雇主发布的项目。我有它,所以一个学生有_许多项目,一个项目属于_学生。问题是在学生被选中之前,该项目可能存在很长时间。我的意思是,在雇主按下视图中的雇用按钮之前,项目的 student_id 为 nil。一旦雇主按下“雇用”按钮,我就会尝试将项目的 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 时,它仍然是 nil。

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

【问题讨论】:

  • 有什么想法吗?我已经工作了几个小时 - 仍然无法正常工作。

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


【解决方案1】:

我认为您想引入一个额外的模型来捕捉学生和项目之间的关系。也许重述问题将有助于澄清这一点。

  • 教授可以随时创建项目
  • 学生可以在项目发布后随时申请
  • 教授必须批准学生的项目作业

第一点表明该项目属于教授(而不是学生)。从第二点和第三点开始,我倾向于说学生有一个项目作业,并且该作业可能处于“已申请”、“已批准”和“已拒绝”状态。考虑到这一点,我可能会这样建模(使用 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

【讨论】:

  • 我实际上已经在项目中使用状态机 gem。我认为您在没有附加关系的情况下达到了我想要做的事情。我现在所拥有的是一个项目最初处于“发布”状态。当学生被录用时,它会变为状态“actual_job”。我想要的是当它变为状态'actual_job'时,student_id 与正确的学生相关联。知道该怎么做吗?
  • 对不起,我忽略了关系——它与我提出的作业基本相同。你是如何调用 Project#change_it 的?
  • 我用这个:' after_transition :posting => :actual_job, :do => :change_it '。我知道它会被调用,因为 deny_applicants 有效。
【解决方案2】:

您已正确设置关联。

如果错误发生在 Project#change_it 中,那么我怀疑

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

没有返回关系。

【讨论】:

  • 我不明白这是怎么回事。您的评论确实让我重新思考了这个问题,因此我更新了内容以提供更多信息。
  • 您没有向我们展示创建关系并将 student_id 和 project_id 分配给关系的代码。您描述的工作流程中何时发生这种情况?
【解决方案3】:

我终于明白了。只是为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 2017-04-30
    • 1970-01-01
    相关资源
    最近更新 更多