我有两个模型:Project 和 ProjectDiscipline:
class Project < ActiveRecord::Base
has_many :project_disciplinizations, :dependent => :destroy
has_many :project_disciplines, through: :project_disciplinizations
attr_accessible :project_discipline_ids
attr_accessible :project_disciplines_attributes
accepts_nested_attributes_for :project_disciplines, :reject_if => proc { |attributes| attributes['name'].blank? }
end
class ProjectDiscipline < ActiveRecord::Base
attr_accessible :name
has_many :project_disciplinizations, :dependent => :destroy
has_many :projects, through: :project_disciplinizations
end
class ProjectDisciplinization < ActiveRecord::Base
attr_accessible :project_discipline_id, :project_id
belongs_to :project_discipline
belongs_to :project
end
在新建/编辑 Project 表单上,我有一个学科列表和每个学科的复选框,以便用户可以选择学科:
<div class="control-group">
<label class="control-label">Check disciplines that apply</label>
<div class="controls">
<%= f.collection_check_boxes(:project_discipline_ids, ProjectDiscipline.order('name'), :id, :name, {}, {:class => 'checkbox'}) {|input| input.label(:class => 'checkbox') { input.check_box + input.text }} %>
<p class="help-block">You must choose at least one discipline.</p>
</div>
</div>
我想添加一个验证来要求至少检查一个学科。我已经尝试过,但我还没有弄清楚。如何添加此验证?
最佳答案
答案前的旁注,根据您的模型结构,我会使用 has_and_belongs_to_many 而不是使用此显式链接模型,因为看起来链接模型不会增加任何有值(value)的东西。
不管怎样,答案都是一样的,那就是使用自定义验证。根据您是按原样处理事物还是简化为 has_and_belongs_to many,您会希望验证方式略有不同。
validate :has_project_disciplines
def has_project_disciplines
errors.add(:base, 'must add at least one discipline') if self.project_disciplinizations.blank?
end
或与 has_and_belongs_to_many
validate :has_project_disciplines
def has_project_disciplines
errors.add(:base, 'must add at least one discipline') if self.project_disciplines.blank?
end
关于ruby-on-rails - rails 3 : validate presence of at least one has many through association item,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17813084/