错误为ActiveRecord::RecordInvalid: Validation failed: Route must exist
。
这是代码:
new_route = Route.create!(new_route_data)
new_points.each_with_index do |point, index|
new_point_data = { route_id: new_route.id,
latitude: point[0],
longitude: point[1],
timestamp: point[2] }
new_point = Point.create!(new_point_data)
end
正在报告new_point = Point.create!(new_point_data)
行。
相关详细信息:
routes
表几乎有3M记录points
表有大约2.5B记录Point
模型包含belongs_to :route, counter_cache: true
Route
型号Route
模型确实包含belongs_to :user, counter_cache: true
users
表软件版本:
答案 0 :(得分:0)
首先,您的代码没有意义。您正在迭代 new_point 并将 new_point 分配给块中的某个值。所以我假设你的意思是迭代一些名为data_points的集合
试试这个。
在路线模型中
has_many :points
然后:
new_route = ...
data_points.each do |point|
point_data = {latitude: point[0], ...} # do not include route_id
new_route.points.create(point_data) # idiomatic
end
` 你不需要索引,所以不要使用each_with_index。
答案 1 :(得分:0)
如果不了解Point模型中的验证类型,很难说出问题所在。
我的猜测是你在point.rb中的验证是:
validates :route, presence: true
使用ActiveRecord关系,您可以使用此快捷方式来避免显式分配route_id:
new_point_data = { latitude: point[0],longitude: point[1], timestamp: point[2] }
new_route.points.create!(new_point_data)
其中new_point数据没有route_id。
您还应该重命名要在块中指定的new_point,因为您正在重写您正在迭代的数组。