scinote-web/app/models/result.rb

117 lines
3.4 KiB
Ruby
Raw Normal View History

2017-06-23 21:19:08 +08:00
class Result < ApplicationRecord
2016-02-12 23:52:43 +08:00
include ArchivableModel, SearchableModel
auto_strip_attributes :name, nullify: false
2016-02-12 23:52:43 +08:00
validates :user, :my_module, presence: true
validates :name, length: { maximum: Constants::NAME_MAX_LENGTH }
2016-02-12 23:52:43 +08:00
validate :text_or_asset_or_table
2017-06-28 21:21:32 +08:00
belongs_to :user, inverse_of: :results, optional: true
belongs_to :last_modified_by,
foreign_key: 'last_modified_by_id',
class_name: 'User',
optional: true
belongs_to :archived_by,
foreign_key: 'archived_by_id',
class_name: 'User',
optional: true
belongs_to :restored_by,
foreign_key: 'restored_by_id',
class_name: 'User',
optional: true
belongs_to :my_module, inverse_of: :results, optional: true
2016-02-12 23:52:43 +08:00
has_one :result_asset,
inverse_of: :result,
dependent: :destroy
has_one :asset, through: :result_asset
has_one :result_table,
inverse_of: :result,
dependent: :destroy
has_one :table, through: :result_table
has_one :result_text,
inverse_of: :result,
dependent: :destroy
has_many :result_comments, foreign_key: :associated_id, dependent: :destroy
2016-02-12 23:52:43 +08:00
has_many :report_elements, inverse_of: :result, dependent: :destroy
accepts_nested_attributes_for :result_text
accepts_nested_attributes_for :asset
accepts_nested_attributes_for :table
2017-05-05 22:41:23 +08:00
def self.search(user,
include_archived,
query = nil,
page = 1,
_current_team = nil,
options = {})
2016-02-12 23:52:43 +08:00
module_ids =
MyModule
.search(user, include_archived, nil, Constants::SEARCH_NO_LIMIT)
2017-04-11 20:55:44 +08:00
.pluck(:id)
2016-02-12 23:52:43 +08:00
2017-05-05 22:41:23 +08:00
new_query =
Result
2016-07-21 19:11:15 +08:00
.distinct
2017-05-05 22:41:23 +08:00
.joins('LEFT JOIN result_texts ON results.id = result_texts.result_id')
.where('results.my_module_id IN (?)', module_ids)
.where_attributes_like(['results.name', 'result_texts.text'],
query, options)
2016-07-21 19:11:15 +08:00
unless include_archived
2017-05-05 22:41:23 +08:00
new_query = new_query.where('results.archived = ?', false)
2016-02-12 23:52:43 +08:00
end
# Show all results if needed
if page == Constants::SEARCH_NO_LIMIT
2016-02-12 23:52:43 +08:00
new_query
else
new_query
.limit(Constants::SEARCH_LIMIT)
.offset((page - 1) * Constants::SEARCH_LIMIT)
2016-02-12 23:52:43 +08:00
end
end
def space_taken
is_asset ? result_asset.space_taken : 0
end
def last_comments(last_id = 1, per_page = Constants::COMMENTS_SEARCH_LIMIT)
last_id = Constants::INFINITY if last_id <= 1
comments = ResultComment.joins(:result)
.where(results: { id: id })
.where('comments.id < ?', last_id)
.order(created_at: :desc)
.limit(per_page)
2016-09-20 23:06:07 +08:00
comments.reverse
2016-02-12 23:52:43 +08:00
end
def is_text
self.result_text.present?
end
def is_table
self.table.present?
end
def is_asset
self.asset.present?
end
private
2016-02-12 23:52:43 +08:00
def text_or_asset_or_table
num_of_assigns = 0
num_of_assigns += result_text.blank? ? 0 : 1
num_of_assigns += asset.blank? ? 0 : 1
num_of_assigns += table.blank? ? 0 : 1
# Theoretically, we should make sure == 1, not > 1,
# but due to GUI problems this is how it is
if num_of_assigns > 1
errors.add(:base, "Result can only be instance of text/asset/table.")
elsif num_of_assigns < 1
errors.add(:base, "Result should be instance of text/asset/table.")
end
end
end