Манипулирование пользовательскими полями из консоли Rails

Я использовал этот фрагмент кода, чтобы попытаться массово заменить данные в пользовательском пользовательском поле. Я взял его за основу из импортера Ning.

users=User.where("users.created_at <= '2019-09-13'::timestamp")
users.each do |u|
  u.custom_fields = {"user_field_16" => "Nil"}
  u.save
end

Однако это привело к непреднамеренному последствию — удалению других значений пользовательских полей пользователей.

Может ли кто-нибудь предложить способ изменения значения пользовательского поля пользователя из консоли, который не вызовет хаоса?

По-моему, этот формат меняет только указанное пользовательское поле. Я немного протестировал, и, похоже, всё работает. :+1:

users=User.where("users.created_at <= '2019-09-13'::timestamp")
users.each do |u|
  u.custom_fields["user_field_16"] = "Nil"
  u.save
end

Хотя, если вы хотите, чтобы поле было NULL, а не, скажем, ‘Nil’, попробуйте вот так:

users=User.where("users.created_at <= '2019-09-13'::timestamp")
users.each do |u|
  u.custom_fields["user_field_16"] = NIL
  u.save
end

Также что-то вроде

UserCustomField.create(user_id: 1, name: "user_field_4", value: "Oops")

О, но если у него уже есть значение, оно добавит второе! Так что вы можете

 ucf = UserCustomField.find_by(user_id: 1, name: 'user_field_4')

а затем вам нужно будет либо обновить его, либо создать новый.

Но если вы создадите несколько таких записей, пользовательский интерфейс отобразит их через запятую, а если их отредактировать через интерфейс и сохранить, они будут сохранены как единое значение.

Вы можете просмотреть их с помощью

  UserCustomField.all

Или

UserCustomField.where(name: x)

Это написано по памяти с телефона, поэтому результаты могут отличаться.

Таким образом, вы заменяете всё содержимое хеша u.custom_fields на {"user_field_16" => nil} (обратите внимание, что nil без кавычек)

Спасибо — да, именно это я должен был использовать.

Да, именно это и произошло. После этого я почувствовал себя довольно глупо!

Я считаю этот инструмент полезным для правильного использования синтаксиса Rails при работе с этими пользовательскими полями в консоли Rails:

Если вы заменяете данные в этом поле
UserCustomField.find_by(user_id: =UserID=, name: "=UserFieldName=").update(value: "=NewValue=")

(вызовет ошибку, если в этом поле пока нет данных)

Если вы заполняете это поле впервые
UserCustomField.create(user_id: =UserID=, name: "=UserFieldName=", value: "=NewValue=")

Как вы создали этот динамический контент в посте?

Похоже, что на meta этот компонент включен. (Только предположение