2

我目前正在尝试使用以下代码播种一些测试数据:


  # 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)])

我认为这是相当不言自明的——本质上我想获得一个适用于所选装饰的模型年 ID 数组,选择一个随机的,并将其 ID 用作车辆的模型年 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,从而不模棱两可?

4

3 回答 3

11

执行连接时,您必须为多个表中存在的列添加前缀,例如 id :

model_year_array = trim.model_years.all(:select => "model_years.id").collect(&:id)

应该做的伎俩

于 2012-07-31T14:43:51.703 回答
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
于 2012-07-31T14:57:01.067 回答
1

如果你想让它更健壮一点,你可以询问你的模型它的 table_name 而不是硬编码它。即使在 sql 中重命名表,此代码也不会中断。

model_year_array = trim.model_years.all(:select => "#{ModelYear.table_name}.id").collect(&:id)
于 2015-11-03T21:05:28.460 回答