使用has_many到关系的自定义方法验证

时间:2014-02-19 16:41:29

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

我有两个模型,表和预留,带有has_many通过:另一个名为Collections的模型的关联。

Reservation模型有一个名称,表模型有一个名称和单位(太),而集合模型有一个units_per_table

class Reservation < ActiveRecord::Base
  has_many :collections  
  has_many :tables, through: :collections
  accepts_nested_attributes_for :collections
end

表格模型:

class Table < ActiveRecord::Base
  has_many :collections  
  has_many :reservations, through: :collections
end

和收集模型:

class Collection < ActiveRecord::Base
  belongs_to :table
  belongs_to :reservation
end

我想在预约模型中创建一个功能,以防止在数据库中存储以下情况:我无法预订8人拥有4把椅子的桌子

所以我在Reservation模型中创建了一个函数,如下所示:

def reservation_units_valid
  self.collections.each do |b| 
    table = Table.find(b.table_id) 
    if b.units_per_table > table.units
      errors[:base] << "Can't make a reservation for that many units"
    end
  end
end

 def create

    @reservation = Reservation.new(params_reservation)
    respond_to do |format|  
      if @reservation.save
        format.html do
          redirect_to '/'
        end
        format.json { render json: @reservation.to_json }
        else
          render 'new'
        end
      end
    end

但是我迷失在这里,我不知道我应该给errors.add哪个参数,因为units_per_table属于Collection Model而不属于Reservation Model。我应该在集合模型中添加验证吗?

1 个答案:

答案 0 :(得分:0)

如果找不到要添加错误的特定模型属性,则始终可以向errors[:base]添加常规错误。

class Reservation < ActiveRecord::Base
  def reservation_units_valid
    # ...
    errors[:base] << "Can't make a reservation for that many units."
    # ...
  end
end

来自Working with Validation Errors

  

您可以添加与对象状态相关的错误消息,而不是与特定属性相关。当您想要说对象无效时,无论其属性值如何,都可以使用此方法。由于errors [:base]是一个数组,你可以简单地向它添加一个字符串,它将被用作错误信息。