Skip to content

Commit

Permalink
possibility to create custom discriminator types
Browse files Browse the repository at this point in the history
  • Loading branch information
Dawid Marcin Grzesiak committed Mar 29, 2010
1 parent f07e775 commit 58017d0
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 3 deletions.
2 changes: 1 addition & 1 deletion lib/dm-core/model.rb
Expand Up @@ -548,7 +548,7 @@ def load(records, query)
record = record.dup
field_map.each { |property, field| record[property] = record.delete(field) if record.key?(field) }

model = discriminator && record[discriminator] || self
model = discriminator && (klass = record[discriminator]) && discriminator.typecast(klass) || self

This comment has been minimized.

Copy link
@snusnu

snusnu Mar 29, 2010

That long line looks like it could be extracted either into a local variable or a private method (maybe not worth it). Apart from this minor suggestion, the patch looks good

model_key = model.key(repository_name)

resource = if model_key.valid?(key_values = record.values_at(*model_key))
Expand Down
2 changes: 1 addition & 1 deletion lib/dm-core/property_set.rb
Expand Up @@ -68,7 +68,7 @@ def key

# @api semipublic
def discriminator
@discriminator ||= detect { |property| property.type == Types::Discriminator }
@discriminator ||= detect { |property| property.type.ancestors.include?(Types::Discriminator) }
end

# @api semipublic
Expand Down
8 changes: 7 additions & 1 deletion spec/public/types/discriminator_spec.rb
Expand Up @@ -3,12 +3,18 @@
describe DataMapper::Types::Discriminator do
before :all do
module ::Blog
class NewDiscriminator < DataMapper::Types::Discriminator
primitive Class
default lambda { |resource, property| resource.model }
required true
end

class Article
include DataMapper::Resource

property :id, Serial
property :title, String, :required => true
property :type, Discriminator
property :type, NewDiscriminator
end

class Announcement < Article; end
Expand Down

0 comments on commit 58017d0

Please sign in to comment.