From ca1f0e5bdf336f35c703b3923d892b8b3eaf99f8 Mon Sep 17 00:00:00 2001 From: Damian Caruso Date: Fri, 19 Dec 2014 17:37:13 -0300 Subject: [PATCH] many association, same as referenced but returning the result set instead of the first element --- lib/ork/model/associations.rb | 33 ++++++++++++++++++ test/associations/many_test.rb | 64 ++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 test/associations/many_test.rb diff --git a/lib/ork/model/associations.rb b/lib/ork/model/associations.rb index d24681d..3cc72e5 100644 --- a/lib/ork/model/associations.rb +++ b/lib/ork/model/associations.rb @@ -96,6 +96,39 @@ def referenced(name, model, reference = to_reference) end end + # A macro for defining a method which basically does a find. + # + # Example: + # class Post + # include Ork::Document + # + # reference :blog, :Blog + # end + # + # class Blog + # include Ork::Document + # + # many :posts, :Post + # end + # + # # is the same as + # + # class Blog + # include Ork::Document + # + # def posts + # Post.find(:blog_id => self.id) + # end + # end + # + def many(name, model, reference = to_reference) + define_method name do + return [] if self.id.nil? + model = Ork::Utils.const(self.class, model) + model.find(:"#{reference}_id", self.id) + end + end + # A macro for defining a method which basically does a find. # # Example: diff --git a/test/associations/many_test.rb b/test/associations/many_test.rb new file mode 100644 index 0000000..be18f4d --- /dev/null +++ b/test/associations/many_test.rb @@ -0,0 +1,64 @@ +require_relative '../helper' + +Protest.describe 'many' do + class Blog + include Ork::Document + attribute :name + + many :posts, :Post + many :weird_posts, :Post, :weird_blog + end + + class Post + include Ork::Document + attribute :title + + reference :blog, :Blog + reference :weird_blog, :Blog + end + + setup do + randomize_bucket_name Blog + randomize_bucket_name Post + end + + should 'return an empty list when there is no reference object' do + blog = Blog.new + + assert blog.posts.empty? + end + + test 'defines reader method but not a writer method' do + blog = Blog.new + + assert blog.respond_to?(:posts) + assert !blog.respond_to?(:posts=) + end + + should 'return the objects referenced' do + blog = Blog.create name: 'New' + post = Post.create blog: blog + blog.reload + + assert blog.posts.include?(post) + end + + test 'object reference with not default key' do + blog = Blog.create name: 'New' + post = Post.create weird_blog: blog + + assert blog.weird_posts.include?(post) + end + + should 'update referenced object' do + blog = Blog.create name: 'New' + post = Post.create title: 'First One' + + assert blog.posts.empty? + + post.blog = blog + post.save + + assert blog.posts.include?(post) + end +end