Added MeasurementRoutine as a nested Measurement model
Updated ItemsWithQuantities to work with MeasurementRoutine Replaced ColumnViews HABTM with polymorphic HMT Added Measurement notes Added destroy restrictions on Quantity Replaced BodyTrackingPluginController with Finders concern Removed 'body_trackers' prefix from paths Unified styling for textarea
This commit is contained in:
4
app/models/column.rb
Normal file
4
app/models/column.rb
Normal file
@@ -0,0 +1,4 @@
|
||||
class Column < ActiveRecord::Base
|
||||
belongs_to :column_view, polymorphic: true
|
||||
belongs_to :quantity
|
||||
end
|
||||
@@ -1,19 +0,0 @@
|
||||
class ColumnView < ActiveRecord::Base
|
||||
enum domain: Quantity.domains
|
||||
|
||||
belongs_to :project, required: true
|
||||
has_and_belongs_to_many :quantities, -> { order "lft" }
|
||||
|
||||
validates :name, presence: true, uniqueness: {scope: :domain}
|
||||
validates :domain, inclusion: {in: domains.keys}
|
||||
|
||||
# TODO: enforce column_view - quantity 'domain' identity
|
||||
def toggle_column!(q)
|
||||
column = self.quantities.find(q.id)
|
||||
self.quantities.destroy(column)
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
# Cannot 'create' association, as ColumnView (parent) may not be saved yet
|
||||
self.quantities.append(q)
|
||||
self.save!
|
||||
end
|
||||
end
|
||||
@@ -1,5 +1,11 @@
|
||||
class Measurement < ActiveRecord::Base
|
||||
belongs_to :project, required: true
|
||||
belongs_to :routine, required: true, inverse_of: :measurements,
|
||||
class_name: 'MeasurementRoutine'
|
||||
accepts_nested_attributes_for :routine, allow_destroy: true, reject_if: proc { |attrs|
|
||||
attrs['name'].blank?
|
||||
}
|
||||
after_destroy { self.routine.destroy if self.routine.measurements.empty? }
|
||||
|
||||
belongs_to :source, required: false
|
||||
|
||||
has_many :readouts, inverse_of: :measurement, dependent: :destroy, validate: true
|
||||
@@ -17,7 +23,6 @@ class Measurement < ActiveRecord::Base
|
||||
end
|
||||
end
|
||||
|
||||
validates :name, presence: true
|
||||
validates :taken_at, presence: true
|
||||
|
||||
after_initialize do
|
||||
@@ -26,21 +31,6 @@ class Measurement < ActiveRecord::Base
|
||||
end
|
||||
end
|
||||
|
||||
after_create :seed_column_view, if: -> {self.column_view.quantities.count == 0}
|
||||
after_save :cleanup_column_view, if: :name_changed?
|
||||
|
||||
# Destroy ColumnView after last Measurement destruction
|
||||
after_destroy do
|
||||
unless self.project.measurements.exists?(name: self.name)
|
||||
self.column_view.destroy!
|
||||
end
|
||||
end
|
||||
|
||||
def column_view
|
||||
self.project.column_views
|
||||
.find_or_create_by(name: self.name, domain: ColumnView.domains[:measurement])
|
||||
end
|
||||
|
||||
def taken_at_date
|
||||
self.taken_at.getlocal
|
||||
end
|
||||
@@ -54,27 +44,4 @@ class Measurement < ActiveRecord::Base
|
||||
def taken_at_time=(value)
|
||||
self.taken_at = Time.parse(value, self.taken_at)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def seed_column_view
|
||||
quantities = self.project.quantities.joins(:readouts).includes(readouts: [:measurement])
|
||||
.where(measurements: {name: self.name}).first(6)
|
||||
self.column_view.quantities.append(quantities)
|
||||
self.column_view.save!
|
||||
end
|
||||
|
||||
# Copy/rename ColumnView on Measurement rename
|
||||
def cleanup_column_view
|
||||
old_column_view = self.project.column_views
|
||||
.find_by(name: self.name_was, domain: ColumnView.domains[:measurement])
|
||||
return unless old_column_view
|
||||
|
||||
if self.project.measurements.exists?(name: self.name_was)
|
||||
self.column_view.quantities.append(old_column_view.quantities)
|
||||
self.column_view.save!
|
||||
else
|
||||
old_column_view.update!(name: self.name)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
11
app/models/measurement_routine.rb
Normal file
11
app/models/measurement_routine.rb
Normal file
@@ -0,0 +1,11 @@
|
||||
class MeasurementRoutine < ActiveRecord::Base
|
||||
belongs_to :project, required: true
|
||||
has_many :measurements, -> { order "taken_at DESC" }, inverse_of: :routine,
|
||||
foreign_key: 'routine_id', dependent: :restrict_with_error,
|
||||
extend: BodyTracking::ItemsWithQuantities
|
||||
has_many :columns, as: :column_view, dependent: :destroy,
|
||||
extend: BodyTracking::TogglableColumns
|
||||
has_many :quantities, -> { order "lft" }, through: :columns
|
||||
|
||||
validates :name, presence: true, uniqueness: {scope: :project_id}
|
||||
end
|
||||
@@ -5,16 +5,11 @@ class Quantity < ActiveRecord::Base
|
||||
exercise: 2
|
||||
}
|
||||
|
||||
# Has to go before any 'dependent:' association
|
||||
before_destroy do
|
||||
# FIXME: disallow destruction if any object depends on this quantity
|
||||
nil
|
||||
end
|
||||
|
||||
acts_as_nested_set dependent: :destroy, scope: :project
|
||||
belongs_to :project, required: false
|
||||
has_and_belongs_to_many :column_views
|
||||
has_many :readouts
|
||||
has_many :nutrients, dependent: :restrict_with_error
|
||||
has_many :readouts, dependent: :restrict_with_error
|
||||
has_many :columns, dependent: :destroy
|
||||
|
||||
has_one :formula, inverse_of: :quantity, dependent: :destroy, validate: true
|
||||
accepts_nested_attributes_for :formula, allow_destroy: true, reject_if: proc { |attrs|
|
||||
|
||||
Reference in New Issue
Block a user