Hyrax v1.0 ( branch: 1.0-stable )
  • This tutorial assumes that you generated a work type name GenericWork. If you used a different name, substitute that name for all occurrences of GenericWork and generic_work.

The GenericWork class is generated with some default metadata, but we want to update it with our own metadata. The generated version of the file looks like…

# Generated via
#  `rails generate hyrax:work GenericWork`
class GenericWork < ActiveFedora::Base
  include ::Hyrax::WorkBehavior
  include ::Hyrax::BasicMetadata
  # Change this to restrict which works can be added as a child.
  # self.valid_child_concerns = []
  validates :title, presence: { message: 'Your work must have a title.' }
end

Basic and Core metadata

For an current list of metadata fields for the latest version of Hyrax, see the Metadata Application Profile.

Basic metadata

Basic metadata properties are defined in app/models/concerns/hyrax/basic_metadata.rb

Property Predicate Multiple
label ActiveFedora::RDF::Fcrepo::Model.downloadFilename FALSE
relative_path ::RDF::URI.new(‘http://scholarsphere.psu.edu/ns#relativePath’) FALSE
import_url ::RDF::URI.new(‘http://scholarsphere.psu.edu/ns#importUrl’) FALSE
part_of ::RDF::Vocab::DC.isPartOf TRUE
resource_type ::RDF::Vocab::DC.type TRUE
creator ::RDF::Vocab::DC11.creator TRUE
contributor ::RDF::Vocab::DC11.contributor TRUE
description ::RDF::Vocab::DC11.description TRUE
keyword ::RDF::Vocab::DC11.relation TRUE
rights ::RDF::Vocab::DC.rights TRUE
rights_statement ::RDF::Vocab::EDM.rights TRUE
publisher ::RDF::Vocab::DC11.publisher TRUE
date_created ::RDF::Vocab::DC.created TRUE
subject ::RDF::Vocab::DC11.subject TRUE
language ::RDF::Vocab::DC11.language TRUE
identifier ::RDF::Vocab::DC.identifier TRUE
based_near ::RDF::Vocab::FOAF.based_near TRUE
related_url ::RDF::RDFS.seeAlso TRUE
bibliographic_citation ::RDF::Vocab::DC.bibliographicCitation TRUE
source ::RDF::Vocab::DC.source TRUE

Core metadata

Core metadata properties (that should never be removed) are defined in app/models/concerns/hyrax/required_metadata.rb

Property Predicate Multiple
depositor ::RDF::URI.new(‘http://id.loc.gov/vocabulary/relators/dpt’) FALSE
title ::RDF::Vocab::DC.title TRUE
date_uploaded ::RDF::Vocab::DC.dateSubmitted FALSE
date_modified ::RDF::Vocab::DC.modified FALSE

Extend the model

To add a new single-value property

To define a property that has a single text value, add the following to the GenericWork model.

  property :contact_email, predicate: ::RDF::Vocab::VCARD.hasEmail, multiple: false do |index|
    index.as :stored_searchable
  end
  • It will be limited to a single value (set multiple: true or leave off for multi-value, which is the default behavior)
  • If included in the new/edit form, it will have input type=text (There is a bit more configuration under section Add the new single-value property to the new/edit form to have this included in the form.)
  • By setting index.as :stored_searchable, values will be added to the solr_doc as contact_email_tesi indicating this field is English text (te), stored (s), indexed (i)
QUESTION Are all values described in Solrizer::DefaultDescriptors supported within Hyrax property definitions?

To add a new multi-value property

To define a property that has multiple text values, add the following to the GenericWork model.

  property :contact_phone, predicate: ::RDF::Vocab::VCARD.hasTelephone do |index|
    index.as :stored_searchable
  end

Expected behaviors for this property:

  • Can have one or more values assigned. NOTE: By default properties are multi-value. You can also explicitly state this by adding , multiple: true before do |index|
  • The remaining basic behaviors are the same as for single-value properties. See more information under Add the new single-value property to the model Expected behaviors.

To add a new controlled vocabulary property

The process for adding a propery whose value comes from a controlled vocabulary is identical to that of the single and multi-value properties. We will add a single-value controlled vocabulary field here so that it is available for use in later examples.

  property :department, predicate: ::RDF::URI.new("http://lib.my.edu/departments"), multiple: false do |index|
    index.as :stored_searchable, :facetable
  end

Expected behaviors for this property:

  • The behaviors are the same as for single-value properties because we set the property up to be single-value. If this were multi-value, it would follow the behaviors of a multi-value field.

The modified model

With all three properties added, the GenericWork now looks like:

# Generated via
#  `rails generate hyrax:work GenericWork`
class GenericWork < ActiveFedora::Base
  include ::Hyrax::WorkBehavior
  include ::Hyrax::BasicMetadata
  # Change this to restrict which works can be added as a child.
  # self.valid_child_concerns = []
  validates :title, presence: { message: 'Your work must have a title.' }

  property :contact_email, predicate: ::RDF::Vocab::VCARD.hasEmail, multiple: false do |index|
    index.as :stored_searchable
  end

  property :contact_phone, predicate: ::RDF::Vocab::VCARD.hasTelephone do |index|
    index.as :stored_searchable
  end

  property :department, predicate: ::RDF::URI.new("http://lib.my.edu/departments"), multiple: false do |index|
    index.as :stored_searchable, :facetable
  end
end