Skip to content

Instantly share code, notes, and snippets.

@d11wtq
Created October 11, 2011 02:02
Show Gist options
  • Save d11wtq/1277089 to your computer and use it in GitHub Desktop.
Save d11wtq/1277089 to your computer and use it in GitHub Desktop.
require "virtus"
class JsonModel
include Virtus
end
class Node < Virtus::Attribute::Object
attr_reader :type
class << self
def [](type)
raise ArgumentError, "Child nodes may only be other JsonModel classes" unless type <= JsonModel
@generated_class_map ||= {}
@generated_class_map[type] ||= Class.new(self) do
default lambda { |m, a| type.new }
define_method :type do
type
end
define_method :coerce do |value|
value.kind_of?(Hash) ? type.new(value) : value
end
end
end
end
end
class ChildModel < JsonModel
end
class ParentModel < JsonModel
attribute :child, Node[ChildModel]
attribute :string, String
end
# This should be String, but it's a descendant of Node??
puts ParentModel.attributes[:string].class.ancestors.inspect
@dkubb
Copy link

dkubb commented Oct 11, 2011

The bug for this is in solnic/virtus#26 .. and it is now resolved.

(Added for posterity for anyone that comes across this in google)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment