kullanarak serialize? çok daha uygun Raylar> = 3.1 cevabını aşağıdaActiveRecord Ben tefrika sütunu kullanan bir modele sahip JSON yerine YAML
cevap
yapabilirsiniz sadece
Ben varsayılan alır kendi YAML kodlayıcı yazdıBence bunun nedeni: [: dump,: load] .all {| s | :: JSON.respond_to? s} ', sadece varsayılan 'YAMLColumn' gibi yapar. Bir denetleyicide, 'JSON == :: JSON' ve' JSON! = :: ActiveSupport :: JSON'. –
Bu Rails 3.2.1 ile çalıştı, ancak 3.2.2 ile durdu: https://github.com/rails/rails/issues/5797 bakın Umarım bu çok uygun olduğu için sabitlenir! – gmcnaughton
3.2.5 –
Güncelleme
Bkz ortalarında en yüksek puanlı yanıt. Bu Rails < 3.1 için mükemmel bir cevaptır.
Muhtemelen aradığınız şey budur. Model geri aramalar ekleyin
gem install json
2) oluştur JsonWrapper sınıf
# lib/json_wrapper.rb
require 'json'
class JsonWrapper
def initialize(attribute)
@attribute = attribute.to_s
end
def before_save(record)
record.send("#{@attribute}=", JsonWrapper.encrypt(record.send("#{@attribute}")))
end
def after_save(record)
record.send("#{@attribute}=", JsonWrapper.decrypt(record.send("#{@attribute}")))
end
def self.encrypt(value)
value.to_json
end
def self.decrypt(value)
JSON.parse(value) rescue value
end
end
3):
Form.find(:first).to_json
Güncelleme
1) 'json' gem yükleyin
#app/models/user.rb
class User < ActiveRecord::Base
before_save JsonWrapper.new(:name)
after_save JsonWrapper.new(:name)
def after_find
self.name = JsonWrapper.decrypt self.name
end
end
4) Test edin!
User.create :name => {"a"=>"b", "c"=>["d", "e"]}
PS:
Oldukça KURU değil, ama ben elimden geleni yaptım. Herkes User
modelinde after_find
'u düzeltebilirse harika olur. Sonunda
require "json/ext"
before_save :json_serialize
after_save :json_deserialize
def json_serialize
self.options = self.options.to_json
end
def json_deserialize
self.options = JSON.parse(options)
end
def after_find
json_deserialize
end
Alkış, oldukça kolay:
adresine bakın. . O ister: Seçenekler özniteliği, jml verisine serileştirilecek, yaml'ye değil. – Eimantas
Ja, serialize kullanarak, seçenekler alanındaki değerler veritabanında YAML-serialized değeri olarak saklanır. Bunun yerine JSON olmasını istiyorum. –
Cevabı güncellendi. –
Benim gereksinimleri yani benim distile kod yukarıdaki cevabı bir çeşidi, bu aşamada kod yeniden kullanımı çok gerek yoktu!
Bu yalnızca belirli veri türleriyle çalışacaktır. Örneğin 'input = 'foo'; serialized = input.to_json; JSON.parse (serialized) ' # => JSON :: ParserError: 757: /Users/username/.rbenv/versions/2.2.2/lib/ruby/gems/2.2 adresinden" foo "'daki beklenmedik belirteci .0/gems/json-1.8.3/lib/json/common.rb: 155: 'parse' https://makandracards.com/makandra/15611-how-to-fix-unexpected-token-error -for-json-parse Bunun için iyi bir geçici çözüm, Ruby's Marshal kütüphanesini kullanmaktır. JSON veya YAML'den daha hızlı ve güvenilirdir. –
Daha basit bir çözüm, this blog post by Michael Rykov'da açıklandığı gibi composed_of
kullanmaktır. Bu çözümü çok beğendim çünkü daha az geri arama kullanılmasını gerektiriyor.
composed_of :settings, :class_name => 'Settings', :mapping => %w(settings to_json),
:constructor => Settings.method(:from_json),
:converter => Settings.method(:from_json)
after_validation do |u|
u.settings = u.settings if u.settings.dirty? # Force to serialize
end
Ne yazık ki, corporate_of kullanımdan kaldırılmıştır. http://blog.plataformatec.com.br/2012/06/about-the-composed_of-removal/ bunun yerine özel bir serializer kullanılmasını önerir. –
Aleran, Rails 3 ile bu yöntemi kullandık: Burada
bu özü nedir? Biraz da aynı sorunu yaşadım ve bu yazıya Michael Rykov tarafından girdiğimde serileştirilmeye doğru ilerliyordum, ancak blogunda yorum yapmak mümkün değil ya da en azından bu yazıyla ilgili. Anladığım kadarıyla, Ayarlar sınıfını tanımlamanıza gerek olmadığını söylüyor, ancak bunu denediğimde, Ayarın tanımlanmadığını bana anlatmaya devam ediyor. Öyleyse sadece onu kullanıp kullanmadığınızı ve daha ne anlatılmalı? Teşekkürler.Elbette Ayar sınıfına ihtiyacınız var. Ama muhtemelen doğrudan JSON sınıfında çalışabilirsiniz. : constructor => JSON.yöntem (: ayrıştırma),: dönüştürücü => JSON.method (: ayrıştırma),: eşleme =>% w (my_attribute to_json). Yine de denemedim. – balu
Rails 3.1'de serialize
numaralı özel kodlayıcıları kullanabilirsiniz.
class ColorCoder
# Called to deserialize data to ruby object.
def load(data)
end
# Called to convert from ruby object to serialized data.
def dump(obj)
end
end
class Fruits < ActiveRecord::Base
serialize :color, ColorCoder.new
end
Bu yardımcı olur umarım.
Referanslar:
Tanımı serialize
ait: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/base.rb#L556
varsayılan YAML kodlayıcı rayları gemilere: load
çağrısı https://github.com/rails/rails/blob/master/activerecord/lib/active_record/coders/yaml_column.rb
Ve bu olur: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_methods/read.rb#L132
Rails'e dahil edilmemiş olmasına rağmen, yazım sırasında, buradaki Rails'e bir JSONColumn Coder katkıda bulundu: https://gist.github.com/txus/rails/blob/1a2ce8e56c4313a7466c2b0b08a037e44d033f6c/activerecord/lib/active_record/coders /json_column.rb - çekme isteği ayrıntıları burada: https://gist.github.com/rails/rails/pull/196. Umarım bu, serialize + JSON kullanmak isteyen herkes yardımcı olur. –
serialize :attr, JSON
0 kullanıyoryöntem şöyle çalışır: url json ve kimlik denetimi kullanılmıyorsa Serileştirilecek niteliktir
composed_of :auth,
:class_name => 'ActiveSupport::JSON',
:mapping => %w(url to_json),
:constructor => Proc.new { |url| ActiveSupport::JSON.decode(url) }
url özniteliği için json formatında değerini kaydeder modeline uygun yeni bir yöntemdir. (Tam olarak test ancak çalışıyor gibi görünüyor değil) Rails 3.1
class Form < ActiveRecord::Base
serialize :column, JSON
end
Umut. Burada sınıf: örnek yöntemler modelin tanımı serialize
ikinci argüman olarak geçirilecek bir örneği gerektirir olan
class JSONColumn
def initialize(default={})
@default = default
end
# this might be the database default and we should plan for empty strings or nils
def load(s)
s.present? ? JSON.load(s) : @default.clone
end
# this should only be nil or an object that serializes to JSON (like a hash or array)
def dump(o)
JSON.dump(o || @default)
end
end
load
yana ve dump
. İşte bunun bir örnek:
class Person < ActiveRecord::Base
validate :name, :pets, :presence => true
serialize :pets, JSONColumn.new([])
end
Ben, yeni bir örneğini oluşturarak örneği yüklenirken ve lRB bir örneğini damping çalıştı ve hepsi düzgün çalışması gibiydi. Ben de bu konuda bir blog post yazdım.
olmalıdır Rails için gerçekten yeniyim. JSONColumn sınıfını nereye koyayım? Nereye ekleyebilirim? Teşekkürler! –
Bunu yapmanın pek çok yolu var, ama burada bir yol var: 'lib/json_column.rb' içine koyabilir ve' 'json_column''unu' config/environment.rb''ye ekleyebilirsiniz. –
Bunun için teşekkürler. Varsayılan bir değer ayarlayabileceğinize sevindim. Bunu bir set (sırasız dizi) gibi davranan bir sütun oluşturmak için kullandım: serileştirme: bir şey, JsonSerializer.new (Set.new) –
- 1. Ben şuna benzer bir Django modele sahip
- 2. Ben Ef6 met oluşturulduğu bir modele sahip Ef6
- 3. PostGresql JSON sütunu HashWithIndifferentAccess olarak
- 4. Her JSON nesnesini bir modele kaydedin
- 5. Su Hattı, ben video modele sahip dizideki
- 6. Böyle bir modele sahip listemde
- 7. Böyle bir özyinelemeli modele sahip
- 8. Django modeli seçimler: Ben seçenekleriyle modele sahip tuple
- 9. YAML ile Ansible ayrıştırma JSON
- 10. YAML/JSON modelinden bir model oluşturun
- 11. Django formu basit bir modele sahip
- 12. Tek bir modele sahip çoklu denetleyiciler
- 13. ActiveRecord
- 14. Django - Ben isteğe bağlı dosya alanına sahip bir modele sahip Yok
- 15. Bir datetime sütunu sorgulamak için bir activerecord deyimi yazma
- 16. ActiveRecord: ilişkili kayıtları Ben alamıyorum
- 17. RESTeasy ve modele sahip bir JSP sayfasına dönme
- 18. piton tefrika C# dosyasını
- 19. Başka bir modelden başka bir modele sahip açılır menü
- 20. jQuery.ajax yerine json
- 21. bir Mongo modeli kendinden Böyle bir modele sahip
- 22. Özel otomatik artışlı ActiveRecord "id" sütunu mümkün mü?
- 23. Raylar (ActiveRecord) birçok tablodan çok
- 24. Ben buna benzer bir ActiveRecord sınıf var
- 25. 'RelatedManager' nesne Böyle tanımlanan bir modele sahip hiçbir özelliği
- 26. ActiveModel - Görünüm - Denetleyici ActiveRecord yerine Rails?
- 27. I bileşimleri, bir kullanıcı bir modele sahip bir ilişkisi olan bir firavunfaresi modeli var
- 28. yaml içinde bir değer için çoklu tuşlar
- 29. YAML
- 30. x86 XOR'u Çıkarma Yerine Kullanan Karşılaştırma Talimatı
Bazı "sihirli" veya eklenti olacağını umuyorum, ama çözüm oldukça düz ileri ve çok güzel çalışıyor. –
toby, kabul edilen cevabı buna göre değiştirebilir misiniz? http://stackoverflow.com/a/6971678/190135 http://meta.stackexchange.com/questions/120568/is-it-possible-to-change-the-chosen-answer – AlexChaffee