2011-06-13 13 views
5

Mam następujący zestaw modeli:Szyny has_many: poprzez ze zwyczajem foreign_key

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 

Wywołanie Cardstock.last.palette_colors daje następujący błąd:

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 

To pokazuje mi, że zapytanie ActiveRecord wytwarza się za pomocą identyfikator karty (66), w której powinien znajdować się sześciokąt kartonowy (bbbbaf). Gdzieś muszę podać ActiveRecord, aby użyć kolumny hex do połączenia między cardstocks i color_matches. Czy ActiveRecord obsługuje to?

+0

To jest Rails 2.3.x, przy okazji. –

Odpowiedz

2

Twoje relacje są tutaj bezsensowne.

  • relacje między kartony ColorMatch powinny być has_and_belongs_to_many związek obustronnie
  • gdziekolwiek masz has_many relationship, trzeba mieć odpowiedni belongs_to relacji w odpowiedniej klasie
+4

To nie do końca prawda. Nie ma absolutnie nic złego w użyciu 'has_many: through' zamiast' has_and_belongs_to_many'; Wierzę, że jest to obecnie nawet preferowany sposób. Jednak masz rację, że coś jest nie tak ze związkami. – Emily

+0

Dziękuję, muszę zmienić wywołanie 'has_many' w ColorMatches na' belongs_to'. Ale myślę, że jest coś więcej, ponieważ to złe zapytanie jest nadal generowane. –

1

Coś jest nie tak z sposób konfigurowania relacji. Nie bardzo rozumiem twój przypadek użycia tutaj, więc nie jestem pewien, gdzie jest problem. Sposób myślenia o tym jest prawdopodobnie relacją wiele do wielu. Dowiedz się, jakie są dwie strony tego wiele-do-wielu i jaki jest model łączenia. Podam przykład zakładający, że ColorMatch jest twoim modelem łączenia - to właśnie odnosi PaletteColor do Cardstock. W takim przypadku, będziemy chcieli swoje relacje wyglądać mniej więcej tak:

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 

Pod względem bazy danych, należy mieć palette_color_id a hex pole na stole color_matches i pole hex na cardstocks stół.

+0

Dokładnie! Jednak po skonfigurowaniu takich skojarzeń nadal mam ten sam błąd. Czy ActiveRecord obsługuje to? Czy muszę ustawić inną tabelę, tylko dla heksów, że 'cardstocks' i' color_matches' będą wskazywały na kolumny z liczbami całkowitymi? –

Powiązane problemy