Class: BiologicalRelationship
- Inherits:
-
ApplicationRecord
- Object
- ActiveRecord::Base
- ApplicationRecord
- BiologicalRelationship
- Includes:
- Housekeeping, Shared::Citations, Shared::DataAttributes, Shared::Identifiers, Shared::IsData, Shared::Notes, Shared::Tags
- Defined in:
- app/models/biological_relationship.rb
Overview
A biological relationship defines a biological relationship type between two biological entities (e.g. specimen and specimen, otu and specimen etc.)
Instance Attribute Summary collapse
-
#inverted_name ⇒ String
The name as if read in reverse (from perspective of object), for example name: ‘parasitoid_of` inverted_name: `host_of`.
-
#is_reflexive ⇒ Boolean
Whether the relationship is reflexive, i.e.
-
#is_transitive ⇒ Boolean
Whether the relationship is transitive, i.e.
-
#name ⇒ String
The name of the relationship.
-
#project_id ⇒ Integer
the project ID.
Class Method Summary collapse
-
.select_optimized(user_id, project_id) ⇒ Hash
Topics optimized for user selection.
-
.used_recently(user_id, project_id) ⇒ Scope
The max 10 most recently used biological relationships.
Methods included from Shared::IsData
#errors_excepting, #full_error_messages_excepting, #identical, #is_community?, #is_destroyable?, #is_editable?, #is_in_use?, #is_in_users_projects?, #metamorphosize, #similar
Methods included from Shared::Identifiers
#dwc_occurrence_id, #identified?, #next_by_identifier, #previous_by_identifier, #reject_identifiers, #uri, #uuid
Methods included from Shared::DataAttributes
#import_attributes, #internal_attributes, #keyword_value_hash, #reject_data_attributes
Methods included from Shared::Citations
#cited?, #mark_citations_for_destruction, #nomenclature_date, #origin_citation_source_id, #reject_citations, #requires_citation?, #sources_by_topic_id
Methods included from Shared::Notes
#concatenated_notes_string, #reject_notes
Methods included from Shared::Tags
#reject_tags, #tag_with, #tagged?, #tagged_with?
Methods included from Housekeeping
#has_polymorphic_relationship?
Methods inherited from ApplicationRecord
Instance Attribute Details
#inverted_name ⇒ String
Returns the name as if read in reverse (from perspective of object), for example name: ‘parasitoid_of` inverted_name: `host_of`. Optional.
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'app/models/biological_relationship.rb', line 23 class BiologicalRelationship < ApplicationRecord include Housekeeping include Shared::Tags include Shared::Notes include Shared::Citations include Shared::DataAttributes include Shared::Identifiers include Shared::IsData validates_presence_of :name has_many :biological_relationship_types, inverse_of: :biological_relationship has_many :subject_biological_relationship_types, -> () {where(type: 'BiologicalRelationshipType::BiologicalRelationshipSubjectType')}, class_name: 'BiologicalRelationshipType', dependent: :destroy has_many :object_biological_relationship_types, -> () {where(type: 'BiologicalRelationshipType::BiologicalRelationshipObjectType')}, class_name: 'BiologicalRelationshipType', dependent: :destroy has_many :biological_properties, through: :biological_relationship_types has_many :subject_biological_properties, through: :subject_biological_relationship_types, source: :biological_property has_many :object_biological_properties, through: :object_biological_relationship_types, source: :biological_property has_many :biological_associations, inverse_of: :biological_relationship accepts_nested_attributes_for :biological_relationship_types, allow_destroy: true # @return [Scope] # the max 10 most recently used biological relationships def self.used_recently(user_id, project_id) t = BiologicalAssociation.arel_table k = BiologicalRelationship.arel_table # i is a select manager i = t.project(t['biological_relationship_id'], t['created_at']).from(t) .where(t['updated_at'].gt( 10.weeks.ago )) .where(t['updated_by_id'].eq(user_id)) .where(t['project_id'].eq(project_id)) .order(t['updated_at'].desc) # z is a table alias z = i.as('recent_t') BiologicalRelationship.joins( Arel::Nodes::InnerJoin.new(z, Arel::Nodes::On.new(z['biological_relationship_id'].eq(k['id']))) ).pluck(:biological_relationship_id).uniq end # @params target [String] one of `Citation` or `Content` # @return [Hash] topics optimized for user selection def self.select_optimized(user_id, project_id) r = used_recently(user_id, project_id) h = { quick: [], pinboard: BiologicalRelationship.pinned_by(user_id).where(project_id: project_id).to_a, recent: [] } if r.empty? h[:quick] = BiologicalRelationship.pinned_by(user_id).pinboard_inserted.where(project_id: project_id).to_a else h[:recent] = BiologicalRelationship.where('"biological_relationships"."id" IN (?)', r.first(10) ).order(:name).to_a h[:quick] = (BiologicalRelationship.pinned_by(user_id).pinboard_inserted.where(project_id: project_id).to_a + BiologicalRelationship.where('"biological_relationships"."id" IN (?)', r.first(5) ).order(:name).to_a).uniq end h end end |
#is_reflexive ⇒ Boolean
Returns whether the relationship is reflexive, i.e. if A is_a B and is_a is_reflexive then B is_a A.
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'app/models/biological_relationship.rb', line 23 class BiologicalRelationship < ApplicationRecord include Housekeeping include Shared::Tags include Shared::Notes include Shared::Citations include Shared::DataAttributes include Shared::Identifiers include Shared::IsData validates_presence_of :name has_many :biological_relationship_types, inverse_of: :biological_relationship has_many :subject_biological_relationship_types, -> () {where(type: 'BiologicalRelationshipType::BiologicalRelationshipSubjectType')}, class_name: 'BiologicalRelationshipType', dependent: :destroy has_many :object_biological_relationship_types, -> () {where(type: 'BiologicalRelationshipType::BiologicalRelationshipObjectType')}, class_name: 'BiologicalRelationshipType', dependent: :destroy has_many :biological_properties, through: :biological_relationship_types has_many :subject_biological_properties, through: :subject_biological_relationship_types, source: :biological_property has_many :object_biological_properties, through: :object_biological_relationship_types, source: :biological_property has_many :biological_associations, inverse_of: :biological_relationship accepts_nested_attributes_for :biological_relationship_types, allow_destroy: true # @return [Scope] # the max 10 most recently used biological relationships def self.used_recently(user_id, project_id) t = BiologicalAssociation.arel_table k = BiologicalRelationship.arel_table # i is a select manager i = t.project(t['biological_relationship_id'], t['created_at']).from(t) .where(t['updated_at'].gt( 10.weeks.ago )) .where(t['updated_by_id'].eq(user_id)) .where(t['project_id'].eq(project_id)) .order(t['updated_at'].desc) # z is a table alias z = i.as('recent_t') BiologicalRelationship.joins( Arel::Nodes::InnerJoin.new(z, Arel::Nodes::On.new(z['biological_relationship_id'].eq(k['id']))) ).pluck(:biological_relationship_id).uniq end # @params target [String] one of `Citation` or `Content` # @return [Hash] topics optimized for user selection def self.select_optimized(user_id, project_id) r = used_recently(user_id, project_id) h = { quick: [], pinboard: BiologicalRelationship.pinned_by(user_id).where(project_id: project_id).to_a, recent: [] } if r.empty? h[:quick] = BiologicalRelationship.pinned_by(user_id).pinboard_inserted.where(project_id: project_id).to_a else h[:recent] = BiologicalRelationship.where('"biological_relationships"."id" IN (?)', r.first(10) ).order(:name).to_a h[:quick] = (BiologicalRelationship.pinned_by(user_id).pinboard_inserted.where(project_id: project_id).to_a + BiologicalRelationship.where('"biological_relationships"."id" IN (?)', r.first(5) ).order(:name).to_a).uniq end h end end |
#is_transitive ⇒ Boolean
Returns whether the relationship is transitive, i.e. if A is_a B is_a C then if is_a is transitive A is_a C.
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'app/models/biological_relationship.rb', line 23 class BiologicalRelationship < ApplicationRecord include Housekeeping include Shared::Tags include Shared::Notes include Shared::Citations include Shared::DataAttributes include Shared::Identifiers include Shared::IsData validates_presence_of :name has_many :biological_relationship_types, inverse_of: :biological_relationship has_many :subject_biological_relationship_types, -> () {where(type: 'BiologicalRelationshipType::BiologicalRelationshipSubjectType')}, class_name: 'BiologicalRelationshipType', dependent: :destroy has_many :object_biological_relationship_types, -> () {where(type: 'BiologicalRelationshipType::BiologicalRelationshipObjectType')}, class_name: 'BiologicalRelationshipType', dependent: :destroy has_many :biological_properties, through: :biological_relationship_types has_many :subject_biological_properties, through: :subject_biological_relationship_types, source: :biological_property has_many :object_biological_properties, through: :object_biological_relationship_types, source: :biological_property has_many :biological_associations, inverse_of: :biological_relationship accepts_nested_attributes_for :biological_relationship_types, allow_destroy: true # @return [Scope] # the max 10 most recently used biological relationships def self.used_recently(user_id, project_id) t = BiologicalAssociation.arel_table k = BiologicalRelationship.arel_table # i is a select manager i = t.project(t['biological_relationship_id'], t['created_at']).from(t) .where(t['updated_at'].gt( 10.weeks.ago )) .where(t['updated_by_id'].eq(user_id)) .where(t['project_id'].eq(project_id)) .order(t['updated_at'].desc) # z is a table alias z = i.as('recent_t') BiologicalRelationship.joins( Arel::Nodes::InnerJoin.new(z, Arel::Nodes::On.new(z['biological_relationship_id'].eq(k['id']))) ).pluck(:biological_relationship_id).uniq end # @params target [String] one of `Citation` or `Content` # @return [Hash] topics optimized for user selection def self.select_optimized(user_id, project_id) r = used_recently(user_id, project_id) h = { quick: [], pinboard: BiologicalRelationship.pinned_by(user_id).where(project_id: project_id).to_a, recent: [] } if r.empty? h[:quick] = BiologicalRelationship.pinned_by(user_id).pinboard_inserted.where(project_id: project_id).to_a else h[:recent] = BiologicalRelationship.where('"biological_relationships"."id" IN (?)', r.first(10) ).order(:name).to_a h[:quick] = (BiologicalRelationship.pinned_by(user_id).pinboard_inserted.where(project_id: project_id).to_a + BiologicalRelationship.where('"biological_relationships"."id" IN (?)', r.first(5) ).order(:name).to_a).uniq end h end end |
#name ⇒ String
Returns the name of the relationship.
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'app/models/biological_relationship.rb', line 23 class BiologicalRelationship < ApplicationRecord include Housekeeping include Shared::Tags include Shared::Notes include Shared::Citations include Shared::DataAttributes include Shared::Identifiers include Shared::IsData validates_presence_of :name has_many :biological_relationship_types, inverse_of: :biological_relationship has_many :subject_biological_relationship_types, -> () {where(type: 'BiologicalRelationshipType::BiologicalRelationshipSubjectType')}, class_name: 'BiologicalRelationshipType', dependent: :destroy has_many :object_biological_relationship_types, -> () {where(type: 'BiologicalRelationshipType::BiologicalRelationshipObjectType')}, class_name: 'BiologicalRelationshipType', dependent: :destroy has_many :biological_properties, through: :biological_relationship_types has_many :subject_biological_properties, through: :subject_biological_relationship_types, source: :biological_property has_many :object_biological_properties, through: :object_biological_relationship_types, source: :biological_property has_many :biological_associations, inverse_of: :biological_relationship accepts_nested_attributes_for :biological_relationship_types, allow_destroy: true # @return [Scope] # the max 10 most recently used biological relationships def self.used_recently(user_id, project_id) t = BiologicalAssociation.arel_table k = BiologicalRelationship.arel_table # i is a select manager i = t.project(t['biological_relationship_id'], t['created_at']).from(t) .where(t['updated_at'].gt( 10.weeks.ago )) .where(t['updated_by_id'].eq(user_id)) .where(t['project_id'].eq(project_id)) .order(t['updated_at'].desc) # z is a table alias z = i.as('recent_t') BiologicalRelationship.joins( Arel::Nodes::InnerJoin.new(z, Arel::Nodes::On.new(z['biological_relationship_id'].eq(k['id']))) ).pluck(:biological_relationship_id).uniq end # @params target [String] one of `Citation` or `Content` # @return [Hash] topics optimized for user selection def self.select_optimized(user_id, project_id) r = used_recently(user_id, project_id) h = { quick: [], pinboard: BiologicalRelationship.pinned_by(user_id).where(project_id: project_id).to_a, recent: [] } if r.empty? h[:quick] = BiologicalRelationship.pinned_by(user_id).pinboard_inserted.where(project_id: project_id).to_a else h[:recent] = BiologicalRelationship.where('"biological_relationships"."id" IN (?)', r.first(10) ).order(:name).to_a h[:quick] = (BiologicalRelationship.pinned_by(user_id).pinboard_inserted.where(project_id: project_id).to_a + BiologicalRelationship.where('"biological_relationships"."id" IN (?)', r.first(5) ).order(:name).to_a).uniq end h end end |
#project_id ⇒ Integer
the project ID
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'app/models/biological_relationship.rb', line 23 class BiologicalRelationship < ApplicationRecord include Housekeeping include Shared::Tags include Shared::Notes include Shared::Citations include Shared::DataAttributes include Shared::Identifiers include Shared::IsData validates_presence_of :name has_many :biological_relationship_types, inverse_of: :biological_relationship has_many :subject_biological_relationship_types, -> () {where(type: 'BiologicalRelationshipType::BiologicalRelationshipSubjectType')}, class_name: 'BiologicalRelationshipType', dependent: :destroy has_many :object_biological_relationship_types, -> () {where(type: 'BiologicalRelationshipType::BiologicalRelationshipObjectType')}, class_name: 'BiologicalRelationshipType', dependent: :destroy has_many :biological_properties, through: :biological_relationship_types has_many :subject_biological_properties, through: :subject_biological_relationship_types, source: :biological_property has_many :object_biological_properties, through: :object_biological_relationship_types, source: :biological_property has_many :biological_associations, inverse_of: :biological_relationship accepts_nested_attributes_for :biological_relationship_types, allow_destroy: true # @return [Scope] # the max 10 most recently used biological relationships def self.used_recently(user_id, project_id) t = BiologicalAssociation.arel_table k = BiologicalRelationship.arel_table # i is a select manager i = t.project(t['biological_relationship_id'], t['created_at']).from(t) .where(t['updated_at'].gt( 10.weeks.ago )) .where(t['updated_by_id'].eq(user_id)) .where(t['project_id'].eq(project_id)) .order(t['updated_at'].desc) # z is a table alias z = i.as('recent_t') BiologicalRelationship.joins( Arel::Nodes::InnerJoin.new(z, Arel::Nodes::On.new(z['biological_relationship_id'].eq(k['id']))) ).pluck(:biological_relationship_id).uniq end # @params target [String] one of `Citation` or `Content` # @return [Hash] topics optimized for user selection def self.select_optimized(user_id, project_id) r = used_recently(user_id, project_id) h = { quick: [], pinboard: BiologicalRelationship.pinned_by(user_id).where(project_id: project_id).to_a, recent: [] } if r.empty? h[:quick] = BiologicalRelationship.pinned_by(user_id).pinboard_inserted.where(project_id: project_id).to_a else h[:recent] = BiologicalRelationship.where('"biological_relationships"."id" IN (?)', r.first(10) ).order(:name).to_a h[:quick] = (BiologicalRelationship.pinned_by(user_id).pinboard_inserted.where(project_id: project_id).to_a + BiologicalRelationship.where('"biological_relationships"."id" IN (?)', r.first(5) ).order(:name).to_a).uniq end h end end |
Class Method Details
.select_optimized(user_id, project_id) ⇒ Hash
Returns topics optimized for user selection.
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'app/models/biological_relationship.rb', line 69 def self.select_optimized(user_id, project_id) r = used_recently(user_id, project_id) h = { quick: [], pinboard: BiologicalRelationship.pinned_by(user_id).where(project_id: project_id).to_a, recent: [] } if r.empty? h[:quick] = BiologicalRelationship.pinned_by(user_id).pinboard_inserted.where(project_id: project_id).to_a else h[:recent] = BiologicalRelationship.where('"biological_relationships"."id" IN (?)', r.first(10) ).order(:name).to_a h[:quick] = (BiologicalRelationship.pinned_by(user_id).pinboard_inserted.where(project_id: project_id).to_a + BiologicalRelationship.where('"biological_relationships"."id" IN (?)', r.first(5) ).order(:name).to_a).uniq end h end |
.used_recently(user_id, project_id) ⇒ Scope
Returns the max 10 most recently used biological relationships.
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'app/models/biological_relationship.rb', line 48 def self.used_recently(user_id, project_id) t = BiologicalAssociation.arel_table k = BiologicalRelationship.arel_table # i is a select manager i = t.project(t['biological_relationship_id'], t['created_at']).from(t) .where(t['updated_at'].gt( 10.weeks.ago )) .where(t['updated_by_id'].eq(user_id)) .where(t['project_id'].eq(project_id)) .order(t['updated_at'].desc) # z is a table alias z = i.as('recent_t') BiologicalRelationship.joins( Arel::Nodes::InnerJoin.new(z, Arel::Nodes::On.new(z['biological_relationship_id'].eq(k['id']))) ).pluck(:biological_relationship_id).uniq end |