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.")