2012-07-31 24 views
2

我目前正在使用下面的代碼填入一些測試數據:Rails的 - 不明確的列名:ID


    # 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

try model_year_id? – 2012-07-31 14:44:18

回答

11

表演時加入,你必須存在於幾個表前綴colums,如ID:

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

應該做的伎倆

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 
1

如果你希望它是有點更強健,你可以問你的模型的表名,而不是硬編碼。即使在sql中重命名該表,該代碼也不會中斷。

model_year_array = trim.model_years.all(:select => "#{ModelYear.table_name}.id").collect(&:id)