Browse files

Merge pull request #169 from dgeb/embed-with-id-suffix

Update foreign key naming conventions - fixes #158
  • Loading branch information...
2 parents b5b3923 + 3b1d2fa commit 7f87c9b3f2bb26372d75a5c10025e5dd881d6688 @steveklabnik steveklabnik committed Dec 21, 2012
Showing with 60 additions and 40 deletions.
  1. +5 −5 README.md
  2. +28 −8 lib/active_model/serializer/associations.rb
  3. +17 −17 test/association_test.rb
  4. +10 −10 test/serializer_test.rb
View
10 README.md
@@ -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 ]
}
}
```
@@ -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 ]
}
}
```
@@ -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" },
View
36 lib/active_model/serializer/associations.rb
@@ -51,7 +51,7 @@ def key
end
def root
- option(:root) || plural_key
+ option(:root) || @name
end
def name
@@ -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|
@@ -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
View
34 test/association_test.rb
@@ -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({
@@ -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)
@@ -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({
@@ -119,7 +119,7 @@ def test_with_default_has_many
include! :comments
assert_equal({
- :comments => [ 1 ]
+ :comment_ids => [ 1 ]
}, @hash)
assert_equal({
@@ -137,7 +137,7 @@ def test_with_default_has_one
include! :comment
assert_equal({
- :comment => 1
+ :comment_id => 1
}, @hash)
assert_equal({
@@ -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)
@@ -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)
@@ -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({
@@ -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)
@@ -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({
@@ -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" }
@@ -352,7 +352,7 @@ def test_when_it_is_not_included
:post => {
:title => "New Post",
:body => "Body",
- :comments => [ 1 ]
+ :comment_ids => [ 1 ]
}
}, json)
end
@@ -368,7 +368,7 @@ def test_when_it_is_excluded
:post => {
:title => "New Post",
:body => "Body",
- :comments => [ 1 ]
+ :comment_ids => [ 1 ]
}
}, json)
end
@@ -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" }
View
20 test/serializer_test.rb
@@ -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
@@ -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" },
@@ -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" },
@@ -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
@@ -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 => [

0 comments on commit 7f87c9b

Please sign in to comment.