Rails:has_many确保选中一个

时间:2014-06-18 11:24:15

标签: ruby-on-rails ruby-on-rails-4

我有一个安装和版本模型以及多个版本的安装。通过安装,您可以创建许多版本,并且用户需要选择将在版本数据库中使用布尔数据类型标记为默认的版本。

如何确保用户从安装屏幕中的许多不同版本的列表中选择了一个版本。只能选择一个,然后将版本模型的default字段更改为“是”'并且属于该安装的所有其他版本都设置为' NO'

1 个答案:

答案 0 :(得分:1)

我建议您在安装模型中添加foreign_key :default_version_id以跟踪默认版本,而不是使用Version类中的整个列来实现此目的。这将使验证更容易。 无论如何,对于当前的实现,验证规则看起来像这样:

Class Installation < ActiveRecord::Base
  has_many :versions

  validate :default_version_must_be_selected

  private

  def default_version_must_be_selected
    if versions.collect{|v| v if(v.default == true)}.compact.length != 1
      errors.add(:base, 'one default version is required'
    end
  end
end

修改

default移除Version标记并将default_version_id添加到Installation后,实施会更直接:

Class Installation < ActiveRecord::Base
  has_many :versions
  belongs_to :default_version, class_name: 'Version'

  validates_presence_of :default_version_id
end

我认为您会发现使用此方法可以更轻松地与安装默认版本进行交互。这只是一个联想。