Skip to content

Commit

Permalink
Merge pull request #169 from dgeb/embed-with-id-suffix
Browse files Browse the repository at this point in the history
Update foreign key naming conventions - fixes #158
  • Loading branch information
steveklabnik committed Dec 22, 2012
2 parents b5b3923 + 3b1d2fa commit 7f87c9b
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 40 deletions.
10 changes: 5 additions & 5 deletions README.md
Expand Up @@ -386,7 +386,7 @@ Now, any associations will be supplied as an Array of IDs:
"id": 1,
"title": "New post",
"body": "A body!",
"comments": [ 1, 2, 3 ]
"comment_ids": [ 1, 2, 3 ]
}
}
```
Expand All @@ -413,7 +413,7 @@ The JSON will look like this:
"comments": [
{ "id": 1, "body": "what a dumb post" }
],
"tags": [ 1, 2, 3 ]
"tag_ids": [ 1, 2, 3 ]
}
}
```
Expand Down Expand Up @@ -444,11 +444,11 @@ this:
"id": 1,
"title": "New post",
"body": "A body!",
"comments": [ 1, 2 ]
"comment_ids": [ 1, 2 ]
},
"comments": [
{ "id": 1, "body": "what a dumb post", "tags": [ 1, 2 ] },
{ "id": 2, "body": "i liked it", "tags": [ 1, 3 ] },
{ "id": 1, "body": "what a dumb post", "tag_ids": [ 1, 2 ] },
{ "id": 2, "body": "i liked it", "tag_ids": [ 1, 3 ] },
],
"tags": [
{ "id": 1, "name": "short" },
Expand Down
36 changes: 28 additions & 8 deletions lib/active_model/serializer/associations.rb
Expand Up @@ -51,7 +51,7 @@ def key
end

def root
option(:root) || plural_key
option(:root) || @name
end

def name
Expand Down Expand Up @@ -92,7 +92,15 @@ def find_serializable(object)
end

class HasMany < Config #:nodoc:
alias plural_key key
def key
if key = option(:key)
key
elsif embed_ids?
"#{@name.to_s.singularize}_ids".to_sym
else
@name
end
end

def serialize
associated_object.map do |item|
Expand Down Expand Up @@ -134,18 +142,30 @@ def polymorphic?
option :polymorphic
end

def polymorphic_key
associated_object.class.to_s.demodulize.underscore.to_sym
def root
if root = option(:root)
root
elsif polymorphic?
associated_object.class.to_s.pluralize.demodulize.underscore.to_sym
else
@name.to_s.pluralize.to_sym
end
end

def plural_key
if polymorphic?
associated_object.class.to_s.pluralize.demodulize.underscore.to_sym
def key
if key = option(:key)
key
elsif embed_ids? && !polymorphic?
"#{@name}_id".to_sym
else
key.to_s.pluralize.to_sym
@name
end
end

def polymorphic_key
associated_object.class.to_s.demodulize.underscore.to_sym
end

def serialize
object = associated_object

Expand Down
34 changes: 17 additions & 17 deletions test/association_test.rb
Expand Up @@ -70,7 +70,7 @@ def test_include_bang_has_many_associations
include! :comments, :value => @post.comments

assert_equal({
:comments => [ 1 ]
:comment_ids => [ 1 ]
}, @hash)

assert_equal({
Expand All @@ -91,7 +91,7 @@ def test_include_bang_with_embed_ids_include_false
include! :comments, :value => @post.comments, :embed => :ids, :include => false

assert_equal({
:comments => [ 1 ]
:comment_ids => [ 1 ]
}, @hash)

assert_equal({}, @root_hash)
Expand All @@ -101,7 +101,7 @@ def test_include_bang_has_one_associations
include! :comment, :value => @post.comment

assert_equal({
:comment => 1
:comment_id => 1
}, @hash)

assert_equal({
Expand All @@ -119,7 +119,7 @@ def test_with_default_has_many
include! :comments

assert_equal({
:comments => [ 1 ]
:comment_ids => [ 1 ]
}, @hash)

assert_equal({
Expand All @@ -137,7 +137,7 @@ def test_with_default_has_one
include! :comment

assert_equal({
:comment => 1
:comment_id => 1
}, @hash)

assert_equal({
Expand All @@ -159,25 +159,25 @@ def test_with_default_has_many_with_custom_key
}, @hash)

assert_equal({
:custom_comments => [
:comments => [
{ :id => 1, :body => "ZOMG A COMMENT" }
]
}, @root_hash)
end

def test_with_default_has_one_with_custom_key
@post_serializer_class.class_eval do
has_one :comment, :key => :custom_comment
has_one :comment, :key => :custom_comment_id
end

include! :comment

assert_equal({
:custom_comment => 1
:custom_comment_id => 1
}, @hash)

assert_equal({
:custom_comments => [
:comments => [
{ :id => 1, :body => "ZOMG A COMMENT" }
]
}, @root_hash)
Expand Down Expand Up @@ -207,7 +207,7 @@ def test_embed_ids_for_has_many_associations
include_bare! :comments

assert_equal({
:comments => [ 1 ]
:comment_ids => [ 1 ]
}, @hash)

assert_equal({}, @root_hash)
Expand All @@ -232,7 +232,7 @@ def test_embed_ids_include_true_for_has_many_associations
include_bare! :comments

assert_equal({
:comments => [ 1 ]
:comment_ids => [ 1 ]
}, @hash)

assert_equal({
Expand All @@ -250,7 +250,7 @@ def test_embed_ids_for_has_one_associations
include_bare! :comment

assert_equal({
:comment => 1
:comment_id => 1
}, @hash)

assert_equal({}, @root_hash)
Expand All @@ -275,7 +275,7 @@ def test_embed_ids_include_true_for_has_one_associations
include_bare! :comment

assert_equal({
:comment => 1
:comment_id => 1
}, @hash)

assert_equal({
Expand Down Expand Up @@ -333,7 +333,7 @@ def test_when_it_is_included
:post => {
:title => "New Post",
:body => "Body",
:comments => [ 1 ]
:comment_ids => [ 1 ]
},
:comments => [
{ :id => 1, :body => "ZOMG A COMMENT" }
Expand All @@ -352,7 +352,7 @@ def test_when_it_is_not_included
:post => {
:title => "New Post",
:body => "Body",
:comments => [ 1 ]
:comment_ids => [ 1 ]
}
}, json)
end
Expand All @@ -368,7 +368,7 @@ def test_when_it_is_excluded
:post => {
:title => "New Post",
:body => "Body",
:comments => [ 1 ]
:comment_ids => [ 1 ]
}
}, json)
end
Expand All @@ -384,7 +384,7 @@ def test_when_it_is_not_excluded
:post => {
:title => "New Post",
:body => "Body",
:comments => [ 1 ]
:comment_ids => [ 1 ]
},
:comments => [
{ :id => 1, :body => "ZOMG A COMMENT" }
Expand Down
20 changes: 10 additions & 10 deletions test/serializer_test.rb
Expand Up @@ -281,8 +281,8 @@ def test_embed_ids
:post => {
:title => "New Post",
:body => "Body of new post",
:comments => [1, 2],
:author => nil
:comment_ids => [1, 2],
:author_id => nil
}
}, serializer.as_json)
end
Expand All @@ -305,8 +305,8 @@ def test_embed_ids_include_true
:post => {
:title => "New Post",
:body => "Body of new post",
:comments => [1, 2],
:author => nil
:comment_ids => [1, 2],
:author_id => nil
},
:comments => [
{ :title => "Comment1" },
Expand All @@ -323,8 +323,8 @@ def test_embed_ids_include_true
:post => {
:title => "New Post",
:body => "Body of new post",
:comments => [1, 2],
:author => 1
:comment_ids => [1, 2],
:author_id => 1
},
:comments => [
{ :title => "Comment1" },
Expand Down Expand Up @@ -558,7 +558,7 @@ def test_embed_id_for_has_one
:post => {
:title => "New Post",
:body => "It's a new post!",
:author => 5
:author_id => 5
}
}, hash.as_json)
end
Expand Down Expand Up @@ -776,12 +776,12 @@ def test_embed_with_include_inserts_at_root
actual = ActiveModel::ArraySerializer.new([post], :root => :posts).as_json
assert_equal({
:posts => [
{ :title => "New Post", :body => "NEW POST", :id => 1, :comments => [1,2] }
{ :title => "New Post", :body => "NEW POST", :id => 1, :comment_ids => [1,2] }
],

:comments => [
{ :body => "EWOT", :id => 1, :tags => [1,3] },
{ :body => "YARLY", :id => 2, :tags => [1,2] }
{ :body => "EWOT", :id => 1, :tag_ids => [1,3] },
{ :body => "YARLY", :id => 2, :tag_ids => [1,2] }
],

:tags => [
Expand Down

0 comments on commit 7f87c9b

Please sign in to comment.