2011-06-13 12 views
5

Tengo el siguiente conjunto de modelos:rieles has_many: a través de la costumbre 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 

Calling Cardstock.last.palette_colors produce el siguiente error:

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 

Esto me muestra que la consulta ActiveRecord genera es el uso de la Identificación de la cartulina (66) donde debería estar utilizando el hexágono de la cartulina (bbbbaf). En algún lugar, necesito especificar ActiveRecord para usar la columna hex para unirme entre cardstocks y color_matches. ¿ActiveRecord es compatible con esto?

+0

Esto es Rails 2.3.x, por cierto. –

Respuesta

2

Sus relaciones están fuera de control aquí.

  • las relaciones entre cartulina y ColorMatch debe haber una relación has_and_belongs_to_many en ambos lados
  • cualquier lugar que tenga una has_many relationship, se necesita un belongs_to relación correspondiente en la clase correspondiente
+4

Eso no es del todo cierto. No hay absolutamente nada de malo en usar 'has_many: through' en lugar de' has_and_belongs_to_many'; Creo que es incluso la forma preferida en estos días. Sin embargo, tienes razón de que hay algo mal con las relaciones. – Emily

+0

Gracias, necesito cambiar la llamada 'has_many' en ColorMatches a' belongs_to'. Pero creo que hay más en el tema, porque esa mala consulta aún se genera. –

1

Hay algo mal con el forma en que tus relaciones están establecidas. No entiendo muy bien su caso de uso específico aquí, así que no estoy seguro de dónde está el problema. La forma de pensar sobre esto es probablemente una relación de muchos a muchos. Averigua cuáles son los dos lados de ese muchos-a-muchos, y cuál es el modelo de unión. Voy a dar un ejemplo suponiendo que ColorMatch es su modelo de unión, es lo que relaciona un PaletteColor con una Cartulina. En ese caso, usted quiere que sus relaciones a ser algo como esto:

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 

en términos de su base de datos, usted debe tener un campo palette_color_id y hex sobre la mesa color_matches, y un campo hex en el cardstocks mesa.

+0

¡Exactamente! Sin embargo, después de configurar mis asociaciones de esa manera, sigo teniendo el mismo error. ¿ActiveRecord es compatible con esto? ¿O necesito configurar otra tabla, solo para los hexes, que 'cartulinas' y' color_matches' señalarían con columnas enteras? –

Cuestiones relacionadas