2013-06-03 3 views
16

私はオブジェクトのエラーに悩まされています。Rails ActiveRecord:PG :: Error:エラー:列参照 "created_at"があいまいです

これは、モデルがどのように見えるかです:クエリです。ここ

class Car < ActiveRecord::Base 
    has_many :car_colors 
    has_many :colors, :through => :car_colors 
end 

class CarColor < ActiveRecord::Base 
    belongs_to :color 
    belongs_to :car 
end 

class Color < ActiveRecord::Base 
    has_many :car_colors 
    has_many :cars, :through => :car_colors 
end 

@cars = Car.all(:joins => :car_colors, :conditions => { :car_colors => {:color_id => params[:id_number]}}, :order => "cars.created_at DESC") 

エラー出力:

PG::Error: ERROR: column reference "created_at" is ambiguous 
LINE 1: ...d" WHERE "car_colors"."color_id" = 2 AND (created_at... 
                  ^
: SELECT "cars".* FROM "cars" INNER JOIN "car_colors" ON "car_colors"."car_id" = "cars"."id" WHERE "car_colors"."color_id" = 2 AND (created_at > '2013-05-03 12:28:36.551058') ORDER BY cars.created_at DESC 

(以下、生成されたSQLクエリエラーメッセージ)は問題ないと思われますが、エラーメッセージの原因は何ですか?

ありがとうございます。

+3

されています。投稿したクエリには何もないことは間違いありませんか?団体などに条件はありませんか?何かが日付条件を適用していますが、クエリの何もそれを行うべきではありません。 – Matt

+0

はい、私は完全に確信しています。だからこそ奇妙なエラーです。 – user984621

答えて

30

car_colorsテーブルにcreated_atフィールドがある可能性があります。あいまいさを解消するにはcreated_atcars.created_atである必要があります。

+0

私は 'car_colors'の移行をチェックしています。はい、' t.timestamps'がありますが、なぜこの問題がありますか?とにかく、私はそれを削除しようとします。 2番目の文はどういう意味ですか? – user984621

+1

PGは、あなたが 'cars'や' car_colors'の 'created_at'を意味しているかどうかを知ることができないので、問題です... SQLは、あいまいさを与える言語ではありません。あなたが見ているエラーメッセージで拒否されるべきではありません。 –

+0

これは、なぜ 'AND(created_at> '2013-05-03 12:28:36.551058')'がSQLに現れ、タイムスタンプを削除するのが解決策ではないのかを説明していません。 – Matt

1

が参加するモデルから、あなたのタイムスタンプを削除しないでください、彼らは問題ではありません - 問題は、何かがあなたのクエリに条件を追加していることである。

AND (created_at > '2013-05-03 12:28:36.551058') 

日が1ヶ月前であるので、コードを検索してone.month.agoを探して、それがおそらくあなたの車やcar_colorsモデルのどのスコープにも含まれているかどうかを確認してください。検索結果が何も表示されない場合は、スコープを手動で確認してください。

タイムスタンプを削除するとクエリが機能しますが、正しいことではありません。

+0

と呼ばれています。私は同様のエラー(別の列)を取得していましたが、ソート列であることが判明しました。インスピレーションをありがとう! –

16

次のように範囲を定義します。

scope :scope_age, -> { order(created_at: :desc) } 

いうより:

scope :scope_age, -> { order("created_at DESC") } 

をそれはスコープが定義されているモデルのプロパティを使用して、あいまいさを取り除く

+0

これは私にとってはうまくいきませんでした。 'order(name::asc)'を試したときに、{:name =>:asc}:Hash "の未定義のメソッド 'gsub'を取得していました。しかし、私はorder( "users.name ASC")を動作させることができました。 私の答えに私を得たインスピレーションをありがとう! – Yetti

+1

スコープがマルチカラムを使用している場合は? – TiggerToo

関連する問題