Активная запись update_attribute выполняет запрос DELETE для связанного объекта (дочернего элемента) объекта (родительского элемента) при обновлении родительского элемента.

Rails: 3.0.11

Рубин: 1.9.3

Почему активная запись update_attribute выполняет запрос DELETE для связанного объекта (дочернего элемента) объекта (родительского элемента), когда я обновил родительский элемент?

Ниже приведены мои занятия:

class User < ActiveRecord::Base

  has_many :user_keywords, :dependent => :destroy  
  has_many :keywords, :through => :user_keywords

end

class UserKeyword < ActiveRecord::Base
  belongs_to :user
  belongs_to :keyword
end

class Keyword < ActiveRecord::Base
  has_many :user_keywords
  has_many :users, :through => :user_keywords
end

На интерфейсе у меня есть флажок для каждого ключевого слова.

  • Флажок: Ключевое слово 1
  • Флажок: Ключевое слово 2
  • Флажок: Ключевое слово 3
  • Флажок: Ключевое слово 4

Впервые я установил флажки "Ключевое слово 1" и "Ключевое слово 2", чтобы обновить ключевые слова пользователя.

Я снова отредактировал пользователя для обновления связанных ключевых слов, установив флажки "Ключевое слово 1" и "Ключевое слово 3", и обновил пользователя. Второе обновление удалило предыдущие записи в моей таблице USER_KEYWORDS.

Следующее - мой вывод консоли, показывающий выполняемый оператор DELETE:

  User Load (55.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 5 LIMIT 1
  Keyword Load (0.2ms)  SELECT "keywords".* FROM "keywords" WHERE "keywords"."id" IN (1, 3)
  Keyword Load (0.2ms)  SELECT "keywords".* FROM "keywords" INNER JOIN "user_keywords" ON "keywords".id = "user_keywords".keyword_id WHERE (("user_keywords".user_id = 5))
  AREL (0.2ms)  DELETE FROM "user_keywords" WHERE "user_keywords"."user_id" = 5 AND "user_keywords"."keyword_id" = 2
  AREL (0.1ms)  INSERT INTO "user_keywords" ("keyword_id", "user_id", "status", "created_at", "updated_at") VALUES (3, 5, 'f', '2012-06-12 13:15:43.912236', '2012-06-12 13:15:43.912236')

Опция: зависящий от метода has_many говорит ( http://guides.rubyonrails.org/association_basics.html):

4.3.2.6: зависимый

Если вы установите параметр: зависимый параметр:destroy, то удаление этого объекта вызовет метод destroy для связанных объектов, чтобы удалить эти объекты. Если вы установите опцию: зависящее от: delete_all, то удаление этого объекта приведет к удалению связанных объектов без вызова их метода уничтожения. Если вы установите для параметра: variable значение: nullify, то при удалении этого объекта внешний ключ в связанных объектах будет иметь значение NULL.

Эта опция игнорируется при использовании опции: через в ассоциации. ##

Я не могу понять это поведение. Кто-нибудь может уточнить или уточнить это?

1 ответ

Решение

Оператор delete удалял только связь для ключевого слова 2. Когда вы отправили форму с двумя флажками, система предполагает, что вы хотите, чтобы эти два элемента были связаны, но ни один из других, которые не были проверены. Поэтому при загрузке тока user_keyword ассоциации, он увидел, что существует одна существующая запись, которую вы не решили сохранить, поэтому он удалил ее. Затем он увидел, что был один новый, поэтому он создал новый.

Если вы хотите только добавлять отношения, а не удалять отношения, то я бы не рекомендовал флажки, так как проверка флажка подразумевает добавление, но удаление флажка подразумевает разрушение отношения (что и было в этом случае в rails). Кнопка с функциональностью AJAX может иметь больше смысла. Если вы хотите оставить флажки, но не позволите рельсам разрушать отношения, которые не были выбраны, то вам придется строить отношения самостоятельно на основе параметров, а не полагаться на магию рельсов, чтобы выполнить эту работу за вас.

Обратите внимание, что это не связано с :dependent Опция, это просто из-за отношений, которые вы установили в моделях и в форме.

Другие вопросы по тегам