luis@328: class Authorship < ActiveRecord::Base luis@1123: unloadable luis@1123: luis@328: belongs_to :author luis@328: belongs_to :publication luis@1123: luis@483: accepts_nested_attributes_for :author luis@483: accepts_nested_attributes_for :publication luis@686: luis@686: validates_presence_of :name_on_paper luis@1123: luis@1286: attr_accessor :search_author_class, :search_author_id, :search_name, :search_results, :identify_author luis@1364: luis@1364: before_create :associate_author_user luis@591: luis@1363: # tod: review scope of ordering luis@1363: acts_as_list :column => 'auth_order' luis@1317: luis@1124: # todo: review usage of scope --lf.20130108 luis@1123: scope :like_unique, lambda {|q| luis@601: s = "%#{q.to_s.strip.downcase}%" luis@601: {:conditions => ["LOWER(name_on_paper) LIKE :s OR LOWER(email) LIKE :s", {:s => s}], luis@601: :order => 'name_on_paper', luis@601: :group => "name_on_paper, institution, email" luis@601: } luis@601: } luis@601: luis@1124: # todo: review usage of scope --lf.20130108 luis@1123: scope :like, lambda {|q| luis@591: s = "%#{q.to_s.strip.downcase}%" luis@601: {:conditions => ["LOWER(name_on_paper) LIKE :s OR LOWER(email) LIKE :s", {:s => s}], luis@591: :order => 'name_on_paper' luis@591: } luis@591: } luis@1123: luis@592: def name luis@592: return self.name_on_paper luis@592: end luis@1123: luis@591: def <=>(authorship) luis@592: name.downcase <=> authorship.name.downcase luis@592: end luis@1123: luis@592: def mail luis@592: return self.email luis@591: end luis@1123: luis@1123: protected luis@1123: def associate_author_user luis@1366: luis@1366: logger.error { "search_author_class '#{self.search_author_class}'" } luis@1366: luis@1286: case self.search_author_class luis@1366: when "" luis@1366: logger.debug { "Unknown Author to be added..." } luis@1366: when "User" luis@1366: author = Author.new luis@1366: author.save luis@1366: self.author_id = author.id luis@1366: luis@1366: when "Author" luis@1366: selected = self.search_results luis@1366: selected_classname = Kernel.const_get(self.search_author_class) luis@1366: selected_id = self.search_author_id luis@1366: object = selected_classname.find(selected_id) luis@1366: luis@1366: if object.respond_to? :name_on_paper luis@1366: # Authorship luis@1366: self.author_id = object.author.id luis@601: else luis@1366: # User luis@1366: unless object.author.nil? luis@601: self.author_id = object.author.id luis@601: else luis@1366: author = Author.new luis@1366: object.author = author luis@1366: object.save luis@1366: self.author_id = object.author.id luis@601: end luis@1366: end luis@1123: end luis@518: end luis@328: end