Module: Inform::Linkable

Included in:
Object
Defined in:
lib/story_teller/inform/relational/link.rb

Overview

module Linkable

Instance Method Summary collapse

Instance Method Details

#_set_object(link_name, obj = nil) ⇒ Object



199
200
201
202
203
204
# File 'lib/story_teller/inform/relational/link.rb', line 199

def _set_object(link_name, obj = nil)
  return nil if obj.nil?

  link(link_name, obj)
  obj
end


145
146
147
148
149
150
# File 'lib/story_teller/inform/relational/link.rb', line 145

def find_link(link_name)
  return nil unless self.respond_to?(:id)
  return nil if self.id.nil?

  Inform.link_klass.first(name: link_name.to_s, from_id: self.id)
end

rubocop: disable Metrics/MethodLength



153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/story_teller/inform/relational/link.rb', line 153

def link(link_name, obj = nil)
  save_link_endpoint(self)
  save_link_endpoint(obj)

  link = find_link(link_name)
  return link if obj.nil?

  if link.nil?
    clauses = { name: link_name.to_s, from_id: self.id, to_id: obj.id }
    link = Inform.link_klass.find_or_create(**clauses)
  else
    link.to_id = obj.id
    link.save
  end
  link
end

#linked?(link_name) ⇒ Boolean Also known as: _key?

rubocop: enable Metrics/MethodLength

Returns:

  • (Boolean)


171
172
173
174
175
176
# File 'lib/story_teller/inform/relational/link.rb', line 171

def linked?(link_name)
  return false unless self.respond_to?(:id)
  return false if self.id.nil?

  Inform.link_klass.filter(name: link_name.to_s, from_id: self.id).count > 0
end


136
137
138
139
140
141
142
143
# File 'lib/story_teller/inform/relational/link.rb', line 136

def links
  return Array::Empty unless self.respond_to?(:id)
  return Array::Empty if self.id.nil?

  Inform.link_klass.filter(from_id: self.id).all
rescue StandardError => _e
  Array::Empty
end

#linksfrom(link_name = nil) ⇒ Object



206
207
208
209
210
211
212
213
# File 'lib/story_teller/inform/relational/link.rb', line 206

def linksfrom(link_name = nil)
  return Array::Empty unless self.respond_to?(:id)
  return Array::Empty if self.id.nil?

  dataset = Inform.link_klass.filter(to_id: self.id)
  dataset = dataset.filter(name: link_name.to_s) unless link_name.nil?
  dataset.all.map { |link| linked_object(link.from_id) }.compact
end

#linkto(link_name) ⇒ Object Also known as: _get_object



193
194
195
196
# File 'lib/story_teller/inform/relational/link.rb', line 193

def linkto(link_name)
  link = find_link(link_name)
  link.nil? ? nil : linked_object(link.to_id)
end


179
180
181
182
183
184
185
186
187
188
189
190
# File 'lib/story_teller/inform/relational/link.rb', line 179

def unlink(link_name)
  link = find_link(link_name)
  return nil if link.nil?

  object = linked_object(link.to_id)
  link.destroy
  object
rescue Sequel::NoExistingObject => e
  log.warn 'Error: ' + e.message
  log.warn 'No such link: ' + link_name.to_s
  nil
end