我有两个模型,表和预留,带有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。我应该在集合模型中添加验证吗?
答案 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
您可以添加与对象状态相关的错误消息,而不是与特定属性相关。当您想要说对象无效时,无论其属性值如何,都可以使用此方法。由于errors [:base]是一个数组,你可以简单地向它添加一个字符串,它将被用作错误信息。