в Rails, используя HABTM, как избежать нескольких INSERT в объединяемой таблице - PullRequest
0 голосов
/ 26 января 2011

Используя отношение has_and_belongs_to_many, я имею следующее:

model A
has_and_belongs_to_many :B, :join_table => "A_B"
has_and_belongs_to_many :C, :join_table => "A_B"

table A_B
A_id
B_id
C_id

Текущее поведение:

при выполнении A.save я получаю 2 оператора вставки в таблицу A_B - A_id установлен, B_id, установлен, и C_id = 0, а другой, где все только A_id и C_id установлены (нет B_id в инструкции INSERT).Поэтому в моей таблице JOIN есть 2 строки

Желаемое поведение:

при выполнении A.save, я хочу 1 INSERT в таблицу A_B, где все 3 идентификатора установлены правильно.

Как мне это сделать?

Насколько я понимаю (поскольку у меня нет прав на изменение наследства базы данных), я не могу использовать has_many: through для этого, поскольку для таблицы JOIN потребуется столбец id.Если это не так, я открыт для любых предложений.

1 Ответ

0 голосов
/ 26 января 2011

Вы можете сделать это с помощью метода расширения.Вы, вероятно, все еще получите 2 поездки в БД, но одно может быть обновлением.

has_and_belongs_to_many :B, :join_table => "A_B" do
  def save
   abc = A.find_or_create_by_a_id(self.a_id)
   abc.b = self.b
   abc.save
  end
end

has_and_belongs_to_many :C, :join_table => "A_B" do
  def save
   abc = A.find_or_create_by_a_id(self.a_id)
   abc.c = self.c
   abc.save
  end
end

Конечно, вам нужно проверить, является ли это новая запись и обрабатывать в соответствии с ней.Не уверен, что вы можете переопределить сохранение в расширении ассоциации ....

...