我目前正在尝试使用以下代码播种一些测试数据:
# add vehicle
trim = Trim.where(:id => 1 + Random.rand(250)).first
model_year_array = trim.model_years.all(:select => :id).collect(&:id)
vehicle = Vehicle.create(trim_id: trim.id, model_year_id: model_year_array[Random.rand(model_year_array.length - 1)])
我认为这是相当自我解释的 - 基本上我想得到一个适用于所选修剪的model_year id数组,选择一个随机的数组,并使用其id作为车辆的model_year_id。
我遇到的问题是trim.model_years.all(:select => :id).collect(&:id)
部分正在生成id不明确的错误;错误如下:
SQLite3::SQLException: ambiguous column name: id: SELECT id FROM "model_years" INNER JOIN "model_year_trims" ON "model_years"."id" = "model_year_trims"."model_year_id" WHERE "model_year_trims"."trim_id" = 110
如何重新格式化我的代码,以便选择id获取model_year的id,因此不含糊?
答案 0 :(得分:11)
执行联接时,必须为多个表中存在的列添加前缀,例如id:
model_year_array = trim.model_years.all(:select => "model_years.id").collect(&:id)
应该做的伎俩
答案 1 :(得分:1)
解析器不知道是使用一个表还是另一个表中的列ID。你应该有类似的东西:
SELECT "model_years" ."id"
FROM "model_years"
INNER JOIN "model_year_trims" ON "model_years"."id" = "model_year_trims"."model_year_id"
WHERE "model_year_trims"."trim_id" = 110
答案 2 :(得分:1)
如果您希望它更健壮一些,您可以向您的模型询问其table_name,而不是对其进行硬编码。即使在sql中重命名该表,此代码也不会中断。
model_year_array = trim.model_years.all(:select => "#{ModelYear.table_name}.id").collect(&:id)