Активная запись 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
Опция, это просто из-за отношений, которые вы установили в моделях и в форме.