2011-06-13 2 views
5

I 모델의 다음과 같은 설정 :레일 has_many : 관습을 통해 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 

이 날 액티브가 생성하는 쿼리를 사용하고 있음을 보여줍니다

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를 호출하면 다음과 같은 오류를 얻을 수 카드 용지의 ID (66) 카드 스톡의 16 진수 (bbbbaf)를 사용해야합니다. 대체로 hex 열을 사용하여 cardstockscolor_matches 사이에 가입하려면 ActiveRecord로 지정해야합니다. ActiveRecord가 이것을 지원합니까?

+0

이것은 레일즈 2.3.x입니다. –

답변

2

귀하의 관계는 모두 여기에서 벗어났습니다. 마분지와 컬러 매치 사이

  • 관계는
  • 어디
  • 당신이 뭔가 잘못이와있다는 해당 클래스
+4

그건 사실이 아니야. 'has_and_belongs_to_many' 대신에'has_many : through'를 사용하는 데는 아무런 문제가 없습니다. 나는 이것이 심지어 요즘 선호되는 방법이라고 믿습니다. 그러나 관계에 문제가 있다는 것이 맞습니다. – Emily

+0

고마워요, ColorMatches에서'has_many' 호출을'belongs_to'로 변경해야합니다. 그러나 그 나쁜 쿼리가 여전히 생성되기 때문에 문제에 더 많은 것이 있다고 생각합니다. –

1

에 해당 belongs_to 관계를 필요로하는 has_many relationship이 양쪽에 has_and_belongs_to_many 관계이어야한다 당신의 관계가 설정되는 방법. 여기서 구체적인 사용 사례를 이해하지 못하므로 문제가있는 곳을 잘 모릅니다. 이것에 대해 생각하는 방법은 아마도 다 대다 관계 일 것입니다. 그 many-to-many의 양면이 무엇인지, 그리고 join 모델은 무엇인지 알아보십시오. ColorMatch가 조인 모델이라고 가정하고 예제를 제공 할 것입니다.이 모델은 PaletteColor와 Cardstock을 관련시킵니다. cardstocks

데이터베이스의 관점에서
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 필드가 있어야하고, hex 필드 :이 경우, 당신은 당신의 관계는 다음과 같이 보일 싶을 것이다 표.

+0

바로! 그러나 그러한 연관성을 설정 한 후에도 여전히 동일한 오류가 발생합니다. ActiveRecord가 이것을 지원합니까? 아니면'cardstocks'와'color_matches'가 모두 정수 열을 가리키고있는 다른 테이블을 설정해야합니까? –

관련 문제