lib/ronin/model/has_authors.rb in ronin-1.1.0 vs lib/ronin/model/has_authors.rb in ronin-1.2.0

- old
+ new

@@ -15,7 +15,97 @@ # # You should have received a copy of the GNU General Public License # along with Ronin. If not, see <http://www.gnu.org/licenses/>. # -require 'ronin/model/has_authors/class_methods' -require 'ronin/model/has_authors/has_authors' +require 'ronin/model' +require 'ronin/author' + +module Ronin + module Model + # + # Adds an `authors` relationship between a model and the {Author} model. + # + module HasAuthors + # + # Adds the `authors` relationship and {ClassMethods} to the model. + # + # @param [Class] base + # The model. + # + # @api semipublic + # + def self.included(base) + base.send :include, Model, InstanceMethods + base.send :extend, ClassMethods + + base.module_eval do + # The authors associated with the model. + has 0..n, :authors, Ronin::Author, :through => DataMapper::Resource + + Ronin::Author.has 0..n, self.relationship_name, + :through => DataMapper::Resource, + :model => self + end + end + + # + # Class methods that are added when {HasAuthors} is included into a + # model. + # + module ClassMethods + # + # Finds all resources associated with a given author. + # + # @param [String] name + # The name of the author. + # + # @return [Array<Model>] + # The resources written by the author. + # + # @api public + # + def written_by(name) + all('authors.name.like' => "%#{name}%") + end + + # + # Finds all resources associated with a given organization. + # + # @param [String] name + # The name of the organization. + # + # @return [Array<Model>] + # The resources associated with the organization. + # + # @api public + # + def written_for(name) + all('authors.organization.like' => "%#{name}%") + end + end + + # + # Instance methods that are added when {HasAuthors} is included into a + # model. + # + module InstanceMethods + # + # Adds a new author to the resource. + # + # @param [Hash] attributes + # Additional attributes to create the new author. + # + # @example + # author :name => 'Anonymous', + # :email => 'anon@example.com', + # :organization => 'Anonymous LLC' + # + # @api public + # + def author(attributes) + self.authors.new(attributes) + end + end + end + end +end