lib/model/nested/base.rb in fire-model-0.0.15 vs lib/model/nested/base.rb in fire-model-0.0.16
- old
+ new
@@ -27,10 +27,20 @@
def nested_options
self.class.nested_options
end
+ def self.id_key
+ self.id_key_name || "#{self.name.demodulize.singularize.dasherize.downcase}_id".to_sym
+ end
+
+ def set_id_key(value)
+ raise ParentModelNotSetError.new(self) unless self.parent
+ validate_id_key!
+ super(value)
+ end
+
class << self
def in_collection(name)
raise CollectionIsSetError.new(self)
end
@@ -44,10 +54,11 @@
def nested_in(parent, options={})
self.parent = parent
self.nested_options = OpenStruct.new(options)
self.parent.has_nested(self)
+ validate_id_key!
end
def own_path_keys
parent.all_path_keys + [ folder ] + super()
end
@@ -79,12 +90,16 @@
end
protected
def default_folder_name
- name.pluralize
+ name.demodulize.pluralize.dasherize
end
+
+ def validate_id_key!
+ raise DuplicatedIdKeyError.new(self.id_key, self.parent) if self.parent.all_path_keys.include?(id_key)
+ end
end
def method_missing(*args)
if args.first.to_s == self.class.folder
self.class.folder
@@ -93,12 +108,24 @@
end
end
class DuplicatedParentPathKeyError < InvalidPathKeyError
def initialize(key, parent)
- message = "Key '#{key}' is duplicated in a Parent Model '#{parent}'"
+ message = error_message(key, parent)
super(key, message)
end
+
+ def error_message(key, parent)
+ "Key '#{key}' is duplicated in a Parent Model '#{parent}'"
+ end
+ end
+
+ class DuplicatedIdKeyError < DuplicatedParentPathKeyError
+
+ def error_message(key, parent)
+ "ID Key '#{key}' is duplicated in a Parent Model '#{parent}'. Use 'set_key_id' method to define a specific ID Key"
+ end
+
end
class ParentModelNotSetError < FireModelError
def initialize(nested_model)
super("Nested Model '#{nested_model}' has no Parent Model set. Call `nested_in` to set a Parent.")