nathank
(Nathan Kershaw)
1
이 코드 스니펫을 사용하여 사용자 사용자 정의 필드에서 일부 데이터를 일괄 치환하려고 했습니다. 이 코드는 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
그러나 의도치 않은 결과로 사용자들의 다른 사용자 정의 필드 값들이 모두 지워졌습니다.
혼란을 일으키지 않고 콘솔에서 사용자 사용자 정의 필드 값을 수정하는 방법에 대해 조언을 주실 수 있는 분이 계신가요?
이 형식은 해당 커스텀 필드만 변경한다고 생각합니다. 간단히 테스트해 보았는데 효과가 있었던 것 같습니다. 
users=User.where("users.created_at <= '2019-09-13'::timestamp")
users.each do |u|
u.custom_fields["user_field_16"] = "Nil"
u.save
end
다만 ‘Nil’ 대신 필드를 NULL로 설정하고 싶다면 다음 코드를 시도해 볼 수 있습니다:
users=User.where("users.created_at <= '2019-09-13'::timestamp")
users.each do |u|
u.custom_fields["user_field_16"] = NIL
u.save
end
pfaffman
(Jay Pfaffman)
3
또는 다음과 같은 형태로도 가능합니다.
UserCustomField.create(user_id: 1, name: "user_field_4",value: "Oops")
아, 하지만 이미 값이 있는 경우 두 번째 값을 추가하게 됩니다! 따라서 다음과 같이
ucf=UserCustomField.find_by(user_id: name: 'user_field_4')
찾은 후, 기존 값을 업데이트하거나 새 값을 생성해야 합니다.
다만 여러 개를 생성하면 UX(사용자 경험) 화면에서는 쉼표(,)로 구분되어 표시되며, UX를 통해 편집 후 저장하면 단일 값으로 다시 저장됩니다.
다음과 같이 확인해 볼 수 있습니다.
UserCustomField.all
또는
UserCustomField.where(name: x)
휴대폰에서 기억에 의존해 작성했기 때문에 실제 환경에서는 다를 수 있습니다.
fzngagan
(Faizaan Gagan)
5
이렇게 하면 u.custom_fields 해시 안에 있는 모든 내용이 {"user_field_16" => nil}(따옴표 없는 nil에 주의)로 대체됩니다.
nathank
(Nathan Kershaw)
6
감사합니다 - 네, 제가 사용했어야 할 것이 바로 그거였네요.
네, 정확히 그런 일이 발생했어요. 나중에 좀 부끄러웠습니다!
nathank
(Nathan Kershaw)
7
Rails 콘솔에서 이러한 UCF를 조작할 때 Rails 구문을 올바르게 작성하는 데 유용한 도구라고 생각합니다:
해당 필드의 데이터를 교체하는 경우
UserCustomField.find_by(user_id: =UserID=, name: "=UserFieldName=").update(value: "=NewValue=")
(해당 필드에 아직 데이터가 없으면 오류가 발생합니다)
해당 필드를 처음 채우는 경우
UserCustomField.create(user_id: =UserID=, name: "=UserFieldName=",value: "=NewValue=")
j127
8
게시글에 있는 그 동적 콘텐츠는 어떻게 만들었나요?
메타가 이 컴포넌트를 켜 두는 것 같습니다. (추측일 뿐입니다)