-
Notifications
You must be signed in to change notification settings - Fork 44
/
base.rb
112 lines (92 loc) · 3.43 KB
/
base.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# encoding: UTF-8
# Copyright 2011-2013 innoQ Deutschland GmbH
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
class Label::Base < ActiveRecord::Base
self.table_name = 'labels'
# ********** Associations
has_many :labelings, foreign_key: 'target_id', class_name: 'Labeling::Base'
has_many :concepts, through: :labelings, source: :owner
has_many :pref_labelings, foreign_key: 'target_id', class_name: Iqvoc::Concept.pref_labeling_class_name
has_many :pref_labeled_concepts, through: :pref_labelings, source: :owner
has_many :alt_labelings, foreign_key: 'target_id', class_name: Iqvoc::Concept.alt_labeling_class_name
has_many :alt_labeled_concepts, through: :alt_labelings, source: :owner
# ********* Scopes
def self.by_language(lang_code)
lang_code = nil if lang_code.to_s == 'none'
if (lang_code.is_a?(Array) && lang_code.include?('none'))
where(arel_table[:language].eq(nil).or(arel_table[:language].in(lang_code.compact)))
elsif lang_code.blank?
where(arel_table[:language].eq(nil))
else
where(language: lang_code)
end
end
def self.begins_with(prefix)
prefix = prefix.to_s
table = Label::Base.table_name
where("LOWER(SUBSTR(#{table}.value, 1, :length)) = :prefix",
length: prefix.length, prefix: prefix.downcase)
end
def self.missing_translation(lang, main_lang)
joins(:concepts).
joins(sanitize_sql(["LEFT OUTER JOIN labelings pref_labelings ON
pref_labelings.id <> labelings.id AND
pref_labelings.owner_id = concepts.id AND
pref_labelings.type = '%s'", Iqvoc::Concept.pref_labeling_class_name])).
joins(sanitize_sql(["LEFT OUTER JOIN labels pref_labels ON
pref_labels.id = pref_labelings.target_id AND
pref_labels.language = '%s'", lang])).
where('labelings.type = :class_name', class_name: Iqvoc::Concept.pref_labeling_class_name).
where('pref_labels.id IS NULL').
where('labels.language = :lang', lang: main_lang).
includes(:pref_labeled_concepts)
end
def self.by_query_value(query)
where(["LOWER(#{table_name}.value) LIKE ?", query.mb_chars.downcase.to_s])
end
# Attention: This means that even label classes without version controll will also
# have to set the published_at flag to be recognized as published!
def self.published
where(arel_table[:published_at].not_eq(nil))
end
def self.unpublished
where(arel_table[:published_at].eq(nil))
end
# ********* Methods
def published?
true
end
def <=>(other)
self.to_s.downcase <=> other.to_s.downcase
end
def ==(other)
language == other.try(:language) && value == other.try(:value)
end
def eql?(other)
self == other
end
def hash
[value, language].hash
end
def to_literal
"\"#{value}\"@#{language}"
end
def to_s
if (language.presence || 'none') != I18n.locale.to_s
value.to_s + " [#{I18n.t('txt.common.translation_missing_for')} '#{I18n.locale}']"
else
value.to_s
end
end
end