Module: ActiveFedora::Associations::ClassMethods
- Defined in:
- lib/active_fedora/associations.rb
Instance Method Summary collapse
-
#belongs_to(name, options = {}) ⇒ Object
Specifies a one-to-one association with another class.
-
#contains(name, options = {}) { ... } ⇒ Object
This method is used to specify the details of a contained resource.
-
#directly_contains(name, options = {}) ⇒ Object
This method is used to declare an ldp:DirectContainer on a resource you must specify an is_member_of_relation or a has_member_relation.
- #directly_contains_one(name, options = {}) ⇒ Object
-
#has_and_belongs_to_many(name, options = {}) ⇒ Object
Specifies a many-to-many relationship with another class.
- #has_many(name, options = {}) ⇒ Object
-
#indirectly_contains(name, options = {}) ⇒ Object
This method is used to declare an ldp:IndirectContainer on a resource you must specify an is_member_of_relation or a has_member_relation.
Instance Method Details
#belongs_to(name, options = {}) ⇒ Object
Specifies a one-to-one association with another class. This method should only be used if this class contains the foreign key.
Methods will be added for retrieval and query for a single associated object, for which this object holds an id:
- association()
-
Returns the associated object.
nil
is returned if none is found. - association=(associate)
-
Assigns the associate object, extracts the primary key, and sets it as the foreign key.
(association
is replaced with the symbol passed as the first argument, so belongs_to :author
would add among others author.nil?
.)
Example
A Post class declares belongs_to :author
, which will add:
-
Post#author
(similar toAuthor.find(author_id)
) -
Post#author=(author)
The declaration can also include an options hash to specialize the behavior of the association.
Options
- :predicate
-
the association predicate to use when storing the association
REQUIRED
- :class_name
-
Specify the class name of the association. Use it only if that name can’t be inferred from the association name. So
has_one :author
will by default be linked to the Author class, but if the real class name is Person, you’ll have to specify it with this option.
Option examples:
belongs_to :firm, predicate: OurVocab.clientOf
belongs_to :author, class_name: "Person", predicate: OurVocab.
212 213 214 215 216 |
# File 'lib/active_fedora/associations.rb', line 212 def belongs_to(name, = {}) Builder::BelongsTo.build(self, name, ) Builder::SingularProperty.build(self, name, ) end |
#contains(name, options = {}) { ... } ⇒ Object
This method is used to specify the details of a contained resource. Pass the name as the first argument and a hash of options as the second argument Note that this method doesn’t actually execute the block, but stores it, to be executed by any the implementation of the datastream(specified as :class_name)
173 174 175 176 177 |
# File 'lib/active_fedora/associations.rb', line 173 def contains(name, = {}, &block) [:block] = block if block raise ArgumentError, "You must provide a name (dsid) for the datastream" unless name Associations::Builder::Contains.build(self, name.to_sym, ) end |
#directly_contains(name, options = {}) ⇒ Object
This method is used to declare an ldp:DirectContainer on a resource you must specify an is_member_of_relation or a has_member_relation
example:
class FooHistory < ActiveFedora::Base
directly_contains :files, has_member_relation:
::RDF::URI.new("http://example.com/hasFiles"), class_name: 'Thing'
directly_contains :other_stuff, is_member_of_relation:
::RDF::URI.new("http://example.com/isContainedBy"), class_name: 'Thing'
end
119 120 121 |
# File 'lib/active_fedora/associations.rb', line 119 def directly_contains(name, ={}) Builder::DirectlyContains.build(self, name, { class_name: 'ActiveFedora::File' }.merge()) end |
#directly_contains_one(name, options = {}) ⇒ Object
123 124 125 |
# File 'lib/active_fedora/associations.rb', line 123 def directly_contains_one(name, ={}) Builder::DirectlyContainsOne.build(self, name, { class_name: 'ActiveFedora::File' }.merge()) end |
#has_and_belongs_to_many(name, options = {}) ⇒ Object
Specifies a many-to-many relationship with another class. The relatioship is written to both classes simultaneously.
Adds the following methods for retrieval and query:
- collection(force_reload = false)
-
Returns an array of all the associated objects. An empty array is returned if none are found.
- collection<<(object, …)
-
Adds one or more objects to the collection by creating associations in the join table (
collection.push
andcollection.concat
are aliases to this method). Note that this operation instantly fires update sql without waiting for the save or update call on the parent object. - collection.delete(object, …)
-
Removes one or more objects from the collection by removing their associations from the join table. This does not destroy the objects.
- collection=objects
-
Replaces the collection’s content by deleting and adding objects as appropriate.
- collection_singular_ids
-
Returns an array of the associated objects’ ids.
- collection_singular_ids=ids
-
Replace the collection by the objects identified by the primary keys in
ids
. - collection.clear
-
Removes every object from the collection. This does not destroy the objects.
- collection.empty?
-
Returns
true
if there are no associated objects. - collection.size
-
Returns the number of associated objects.
(collection
is replaced with the symbol passed as the first argument, so has_and_belongs_to_many :categories
would add among others categories.empty?
.)
Example
A Developer class declares has_and_belongs_to_many :projects
, which will add:
-
Developer#projects
-
Developer#projects<<
-
Developer#projects.delete
-
Developer#projects=
-
Developer#project_ids
-
Developer#project_ids=
-
Developer#projects.clear
-
Developer#projects.empty?
-
Developer#projects.size
-
Developer#projects.find(id)
-
Developer#projects.exists?(...)
The declaration may include an options hash to specialize the behavior of the association.
Options
- :class_name
-
Specify the class name of the association. Use it only if that name can’t be inferred from the association name. So
has_and_belongs_to_many :projects
will by default be linked to the Project class, but if the real class name is SuperProject, you’ll have to specify it with this option. - :predicate
-
REQUIRED Specify the predicate to use when storing the relationship.
- :inverse_of
-
Specify the predicate to use when storing the relationship on the foreign object. If it is not provided, the relationship will not set the foriegn association.
Option examples:
has_and_belongs_to_many :projects, predicate: OurVocab.worksOn
has_and_belongs_to_many :nations, class_name: "Country", predicate: OurVocab.isCitizenOf
has_and_belongs_to_many :topics, predicate: RDF::FOAF.isPrimaryTopicOf, inverse_of: :is_topic_of
281 282 283 284 |
# File 'lib/active_fedora/associations.rb', line 281 def has_and_belongs_to_many(name, = {}) Builder::HasAndBelongsToMany.build(self, name, ) Builder::Property.build(self, name, .slice(:class_name, :predicate)) end |
#has_many(name, options = {}) ⇒ Object
158 159 160 |
# File 'lib/active_fedora/associations.rb', line 158 def has_many(name, ={}) Builder::HasMany.build(self, name, ) end |
#indirectly_contains(name, options = {}) ⇒ Object
This method is used to declare an ldp:IndirectContainer on a resource you must specify an is_member_of_relation or a has_member_relation
example:
class Proxy < ActiveFedora::Base
belongs_to :proxy_for, predicate: ::RDF::URI.new('http://www.openarchives.org/ore/terms/proxyFor'), class_name: 'ActiveFedora::Base'
end
class FooHistory < ActiveFedora::Base
indirectly_contains :files, has_member_relation: RDF::Vocab::ORE.aggregates,
inserted_content_relation: RDF::Vocab::ORE.proxyFor, class_name: 'Thing',
through: 'Proxy', foreign_key: :proxy_for
indirectly_contains :other_stuff, is_member_of_relation:
::RDF::URI.new("http://example.com/isContainedBy"), class_name: 'Thing',
through: 'Proxy', foreign_key: :proxy_for
end
154 155 156 |
# File 'lib/active_fedora/associations.rb', line 154 def indirectly_contains(name, ={}) Builder::IndirectlyContains.build(self, name, ) end |