2011-06-13 13 views
5

FOREIGN_KEYカスタムとを通じて、私はモデルの次のセットを持っている:Cardstock.last.palette_colorsを呼び出すRailsのhas_manyの:

class Cardstock < ActiveRecord::Base 
    has_many :color_matches, :primary_key => :hex, :foreign_key => :hex 
    has_many :palette_colors, :through => :color_matches 
end 

class ColorMatch < ActiveRecord::Base 
    belongs_to :palette_color 
    has_many :cardstocks, :foreign_key => :hex, :primary_key => :hex 
end 

class PaletteColor < ActiveRecord::Base 
    has_many :color_matches 
    has_many :cardstocks, :through => :color_matches 
end 

は、次のエラーが得られます。

ActiveRecord::StatementInvalid: PGError: ERROR: operator does not exist: character varying = integer 
LINE 1: ...".palette_color_id WHERE (("color_matches".hex = 66)) OR... 
                  ^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 
: SELECT "palette_colors".* FROM "palette_colors" INNER JOIN "color_matches" ON "palette_colors".id = "color_matches".palette_color_id WHERE (("color_matches".hex = 66)) ORDER BY name ASC 

これは、ActiveRecordのは、生成したクエリを使用していることを私に示してカードストックのID(66)ここで、カードストックのヘックス(bbbbaf)を使用する必要があります。どこかで、hex列を使用してcardstockscolor_matchesを結合するには、ActiveRecordに指定する必要があります。 ActiveRecordはこれをサポートしていますか?

+0

ところで、これはRails 2.3.xです。 –

答えて

2

あなたの関係はすべてここからはずれています。はがきとColorMatch間

  • 関係はどこでもあなたがhas_many relationshipを持って両側
  • has_and_belongs_to_many関係である必要があり、あなたが対応するクラスで対応するbelongs_to関係
+4

それは本当ではありません。 'has_and_belongs_to_many'の代わりに' has_many:through'を使うことは間違いありません。私はそれが最近の好ましい方法であると信じています。しかし、関係に何か問題があるということは間違いありません。 – Emily

+0

ありがとうございます。ColorMatchesの 'has_many'呼び出しを' belongs_to'に変更する必要があります。しかし、私は問題がまだ残っているので、その問題がもっとあると思います。 –

1

を必要と間違って何かがありますあなたの関係は設定されています。私はあなたの特定のユースケースをここではあまり理解していないので、どこに問題があるのか​​分かりません。これについて考える方法は、おそらく多対多の関係です。その多対多の2つの側面が何であるかを理解し、結合モデルは何ですか。私は、ColorMatchがあなたの結合モデルであると仮定して例を挙げます - それはPaletteColorをCardstockに関連付けるものです。その場合、あなたはあなたの関係がこのような何かを見たいでしょう:データベースの面では

class Cardstock < ActiveRecord::Base 
    has_many :color_matches, :primary_key => :hex, :foreign_key => :hex 
    has_many :palette_colors, :through => :color_matches 
end 

class ColorMatch < ActiveRecord::Base 
    belongs_to :palette_color 
    belongs_to :cardstocks, :foreign_key => :hex, :primary_key => :hex 
end 

class PaletteColor < ActiveRecord::Base 
    has_many :color_matches 
    has_many :cardstocks, :through => :color_matches 
end 

を、あなたはcolor_matchesテーブルの上にpalette_color_idhexフィールドを持つべきである、とcardstockshexフィールド表。

+0

まさに!しかし、そのような私の関連付けを設定した後、私はまだ同じエラーが発生します。 ActiveRecordはこれをサポートしていますか?あるいは、 'cardstocks'と' color_matches'の両方が整数列を指すように、別のテーブルを設定する必要がありますか? –