Matt のおかげで、いくつか掘り下げて、dm-serializer の to_json メソッドの :method パラメータを見つけました。彼らの to_json メソッドはかなりまともで、基本的には as_json ヘルパー メソッドの単なるラッパーだったので、数行追加するだけで上書きしました。
if options[:include_attributes]
options[:methods] = [] if options[:methods].nil?
options[:methods].concat(model.attributes).uniq!
end
完成したメソッドのオーバーライドは次のようになります。
module DataMapper
module Serializer
def to_json(*args)
options = args.first
options = {} unless options.kind_of?(Hash)
if options[:include_attributes]
options[:methods] = [] if options[:methods].nil?
options[:methods].concat(model.attributes).uniq!
end
result = as_json(options)
# default to making JSON
if options.fetch(:to_json, true)
MultiJson.dump(result)
else
result
end
end
end
end
これは、モデルで使用する基本モジュールに追加した属性メソッドと連携して機能します。関連するセクションは次のとおりです。
module Base
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def attr_accessor(*vars)
@attributes ||= []
@attributes.concat vars
super(*vars)
end
def attributes
@attributes || []
end
end
def attributes
self.class.attributes
end
end
今私の元の例:
require 'json'
class Person
include DataMapper::Resource
include Base
property :id, Serial
property :first_name, String
attr_accessor :last_name
end
ps = Person.new
ps.first_name = "Mike"
ps.last_name = "Smith"
p ps.to_json :include_attributes => true
新しいオプション パラメータを使用すると、期待どおりに動作します。
余分な作業を行うことなく、必要な属性を選択的に取得するために私ができることは、属性名を :methods パラメータに渡すことでした。
p ps.to_json :methods => [:last_name]
または、すでにBase
クラスを持っているので:
p ps.to_json :methods => Person.attributes
次に、コレクションをどのようにサポートしたいかを理解する必要があります。