【问题标题】:Rails: Validating an array of idsRails:验证一组 id
【发布时间】:2016-06-06 15:05:20
【问题描述】:

应用

我正在开发一个大学招生系统,学生可以在该系统中申请最多 5 门课程。我设计这个的方式是有一个 Application 模型和一个 CourseApplication 模型。一个应用程序可以包含许多 course_applications:

class Application < ActiveRecord::Base

  # Assosciations
  belongs_to :user
  has_many :course_applications, dependent: :destroy
  has_many :courses, through: :course_applications
  has_one :reference

  # Validations
  validates :course_applications, presence: true

end

课程申请

class CourseApplication < ActiveRecord::Base

  # Intersection entity between course and application.
  # Represents an application to a particular course, has an optional offer

  # Associations
  belongs_to :application
  belongs_to :course
  has_one :offer, dependent: :destroy

end

我想确保学生不能两次申请同一课程。我已经做了一些研究,但没有成功。这是学生申请的 UI:

Screenshot of application form

选择课程后,课程 ID 将添加到课程 ID 数组中:

def application_params
  params.require(:application).permit(:user, course_ids: [])
end

现在一个学生可以选择两次相同的课程,我想阻止他们这样做。任何帮助深表感谢。

【问题讨论】:

  • 您可以发送ajax 并获取第二选择中的所有元素,除了您在第一选择中已经选择的选项。
  • 优先级重要吗?
  • 感谢cmets,Ropeney的方案通过后端验证有效解决了问题。但是,我仍然要创建前端验证。目前表单只是重置而不显示适当的错误消息。非常感谢编写这些 javascript 验证的任何帮助

标签: ruby-on-rails ruby validation activerecord


【解决方案1】:

对于 Rails 方面,我会在 CourseApplication 上做

validates :course, uniqueness: { scope: :application }

供您参考,请访问:http://guides.rubyonrails.org/active_record_validations.html#uniqueness

也建议在数据库端进行迁移

add_index :course_applications, [:course, :application], :unique => true

为了验证表单,您必须编写 javascript 以确保选择了两件事,当有人尝试这样做时,这只会返回一个错误。

【讨论】:

  • 非常感谢,当两次选择相同的课程时,验证和索引阻止了应用程序的创建。我对范围验证的理解不够好,无法自己实施。
  • 我会研究如何编写那个javascript,我对js不太了解,但我会看看我能走多远。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 2018-07-26
  • 2018-01-25
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多