2011-06-13 19 views
5

Ben modellerin aşağıdaki kümesi vardır:Raylar Has_many: özel ile içinden foreign_key

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 

Bu bana ActiveRecord üretir sorgu kullanarak olduğunu gösterir:

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 

Cardstock.last.palette_colors çağrılması aşağıdaki hata verir kart stoğunun altı (bbbbaf) kullanıldığında kart stoğu numarası (66). Bir yerlerde, cardstocks ve color_matches arasında katılmak için hex sütununu kullanmak için ActiveRecord'a belirtmem gerekiyor. ActiveRecord bunu destekliyor mu?

+0

Bu, Rails 2.3.x sürümüdür. –

cevap

2

İlişkileriniz burada bitmek tükenmek üzere. Kart Stoku ve ColorMatch arasındaki

  • ilişkiler
  • yerde
  • yanlış bir şey ile var karşılık gelen sınıfın
+4

Bu doğru değil. 'Has_many: through' kullanarak' has_and_belongs_to_many' yerine yanlış bir şey yoktur; Bu günlerde bile tercih edilen yol olduğuna inanıyorum. Bununla birlikte, ilişkilerde yanlış bir şeylerin olduğu doğrudur. – Emily

+0

Teşekkür ederim, ColorMatches'teki 'has_many' çağrısını' belongs_to' olarak değiştirmem gerekiyor. Ama bence konuyla ilgili daha fazla şey var, çünkü bu kötü sorgu hala üretiliyor. –

1

bir karşılık gelen belongs_to ilişkiyi lazım, has_many relationship var her iki tarafta da has_and_belongs_to_many ilişki olmalıdır ilişkilerin kurulduğu yol. Özel kullanım durumunuzu tam anlamıyla anlamıyorum, bu yüzden sorunun nerede olduğundan emin değilim. Bunu düşünmenin yolu, muhtemelen çoktan çoğa bir ilişkidir. Pek çoğunun iki tarafının ne olduğunu ve katılma modelinin ne olduğunu anlayın. ColorMatch'in birleştirme modeliniz olduğunu varsaymak için bir örnek vereceğim - bir PaletteColor'u bir Kart Stoğu ile ilişkilendiren şey bu. cardstocks üzerinde

veritabanınızın açısından
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 

, sen color_matches masaya palette_color_id ve hex alan olmalı ve bir hex alan: Bu durumda, kendi ilişkileri şuna benzer isteyeceksiniz tablo.

+0

Tam olarak! Ancak, derneklerimi kurduktan sonra hala aynı hatayı alıyorum. ActiveRecord bunu destekliyor mu? Ya da sadece hexes için başka bir tablo kurmam gerekiyor mu, 'cardstocks' ve 'color_matches' her ikisi de tamsayı sütunları ile işaret eder? –

İlgili konular