Ruby on rails Rails验证错误:ActiveRecord::RecordInvalid
我的Rails应用程序中的验证有点困难。 我有以下设置:Ruby on rails Rails验证错误:ActiveRecord::RecordInvalid,ruby-on-rails,Ruby On Rails,我的Rails应用程序中的验证有点困难。 我有以下设置: class MealDay < ApplicationRecord belongs_to :meal belongs_to :day has_many :meal_day_canteens has_many :canteens, through: :meal_day_canteens validates :meal_id, uniqueness: {scope: :day_id} e
class MealDay < ApplicationRecord
belongs_to :meal
belongs_to :day
has_many :meal_day_canteens
has_many :canteens,
through: :meal_day_canteens
validates :meal_id, uniqueness: {scope: :day_id}
end
#MainController
helping_hash.each { |days, meal|
dayRef = Day.where(date: days).first
mealRef = Meal.where(name: meal)
dayRef.meals << mealRef #This line is obviously throwing the error because a record exists already
}
class MealDay dayRef.finesRails唯一性约束基本上是在后台抛出一个查询来查找数据库中的记录。更多的是旁注,但这已经不安全了,所以我建议您在数据库级别添加一个约束
基本上,您需要手动跳过已经存在的
基本上是这样的:
helping_hash.each do |day, meal|
day_ref = Day.find_by!(date: day)
meal_ref = Meal.find_by!(name: meal)
unless day_ref.meal_ids.include?(meal_ref.id)
# Depending on the number of records you expect
# using day_ref.meals.exists?(id: meal_ref.id) may be a better choice
day_ref.meals << meal_ref
end
end
每天、每顿饭|
day\u ref=day.find\u by!(日期:day)
膳食参考=膳食。查找者!(名称:膳食)
除非日参考餐号包括?(餐号)
#取决于预期的记录数
#使用day\u ref.Founds.exists?(id:Found\u ref.id)可能是更好的选择
第二天参考餐如何rescue
消除错误
helping_hash.each do |days, meal|
dayRef = Day.where(date: days).first
mealRef = Meal.where(name: meal)
dayRef.meals << mealRef rescue next
end
help|u hash.每做一天,每顿饭|
dayRef=天。其中(日期:天)。第一个
mealRef=膳食。其中(名称:膳食)
dayRef.Founds感谢您的回答,但我不想这样做。我可以为exists或include函数定义另一个条件吗?因为如果Found和day已经在数据库中,我不想插入它。基本上是对(Found\u id,day\u id)的约束.我想我的问题并不是很清楚。嘿,这对我的第一部分代码来说很好,但是你能再看一下我的问题并帮我完成我添加的部分吗。谢谢。它被插入了很多次。你在这些模型中也有验证吗?我只是想也是-。-我忘了在那个模型中添加验证。现在每个事情很好。很好。顺便说一句,这是一个黑客解决方案。因为它rescue
s所有的例外情况。不推荐,但如果你知道你在做什么,它会很有用。记下这一点。。
helping_hash.each do |days, meal|
dayRef = Day.where(date: days).first
mealRef = Meal.where(name: meal)
dayRef.meals << mealRef rescue next
end