Это связано с этим кодом:
Суть в том, что мы изменили индекс для категории пользователя следующим образом:
Есть ли у вас группа, которая в настройках сайта одновременно и установлена как «по умолчанию отслеживаемая», и как «по умолчанию просматриваемая»?
Посмотрите на: default categories watching, default categories tracking, default categories muted и default categories watching first post.
Это исправляет проблему:
diff --git a/app/models/user.rb b/app/models/user.rb
index c1a94949a6..85b2ca9244 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -1390,10 +1390,15 @@ class User < ActiveRecord::Base
return if self.staged?
values = []
+ # allocate set later
+ seen = nil
%w{watching watching_first_post tracking muted}.each do |s|
category_ids = SiteSetting.get("default_categories_#{s}").split("|").map(&:to_i)
category_ids.each do |category_id|
+ seen ||= Set.new
+ next if seen.include?(category_id)
+ seen << category_id
next if category_id == 0
values << "(#{self.id}, #{category_id}, #{CategoryUser.notification_levels[s.to_sym]})"
end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index cc50d88b2e..4075ee6194 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -1603,8 +1603,12 @@ describe User do
SiteSetting.default_categories_watching = category0.id.to_s
SiteSetting.default_categories_tracking = category1.id.to_s
- SiteSetting.default_categories_muted = category2.id.to_s
+
+ # this is invalid, but we don't validate so ensure nothing breaks
+ SiteSetting.default_categories_muted = "#{category2.id}|#{category0.id}"
+
SiteSetting.default_categories_watching_first_post = category3.id.to_s
+
end
it "has overriden preferences" do
Но мне не нравится это решение. Настройки сайта должны проверять отсутствие пересечений при сохранении, и нам следует мигрировать некорректные данные.
@daniel, думаю, вы добавили это новое ограничение здесь. Возможно, стоит добавить валидацию, когда пользователи изменяют настройки сайта?