Rails has_many: с помощью custom_key - PullRequest
5 голосов
/ 13 июня 2011

У меня есть следующий набор моделей:

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 выдает следующую ошибку:

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).Где-то мне нужно указать ActiveRecord использовать столбец hex для соединения между cardstocks и color_matches.ActiveRecord поддерживает это?

Ответы [ 2 ]

2 голосов
/ 13 июня 2011

Ваши отношения здесь не в порядке.

  • отношения между Cardstock и ColorMatch должны быть has_and_belongs_to_many отношениями с обеих сторон
  • везде, где у вас есть has_many relationship, вам необходимо соответствующее belongs_to отношение в соответствующем классе
1 голос
/ 13 июня 2011

Что-то не так с вашими отношениями. Я не совсем понимаю ваш конкретный вариант использования здесь, поэтому я не уверен, где проблема. Способ думать об этом, вероятно, как отношения «многие ко многим». Выясните, каковы две стороны этого «многие ко многим» и какова модель соединения. Я приведу пример, предполагая, что 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

С точки зрения вашей базы данных у вас должно быть поле palette_color_id и hex в таблице color_matches и поле hex в таблице cardstocks.

...