From e3d89261a6fd3efe9d9d2a1ab94e19a252ace92c Mon Sep 17 00:00:00 2001 From: Bertocq Date: Tue, 4 Jul 2017 14:21:24 +0200 Subject: [PATCH] Add Sluggable concern and unique validation to Budget, Group and Heading * What: We need to generate slug on Budget, Group and Heading classes, validating its unique for its scope * How: Adding a presence and unique validation using Budget always as scope. --- app/models/budget.rb | 4 +++- app/models/budget/group.rb | 8 ++++++-- app/models/budget/heading.rb | 9 ++++++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/app/models/budget.rb b/app/models/budget.rb index bc7231f29..efb88e62a 100644 --- a/app/models/budget.rb +++ b/app/models/budget.rb @@ -1,13 +1,15 @@ class Budget < ActiveRecord::Base include Measurable + include Sluggable PHASES = %w(accepting reviewing selecting valuating balloting reviewing_ballots finished).freeze CURRENCY_SYMBOLS = %w(€ $ £ ¥).freeze - validates :name, presence: true + validates :name, presence: true, uniqueness: true validates :phase, inclusion: { in: PHASES } validates :currency_symbol, presence: true + validates :slug, presence: true, format: /\A[a-z0-9\-_]+\z/ has_many :investments, dependent: :destroy has_many :ballots, dependent: :destroy diff --git a/app/models/budget/group.rb b/app/models/budget/group.rb index dd7910950..93d7bba63 100644 --- a/app/models/budget/group.rb +++ b/app/models/budget/group.rb @@ -1,10 +1,14 @@ class Budget class Group < ActiveRecord::Base + include Sluggable + belongs_to :budget has_many :headings, dependent: :destroy validates :budget_id, presence: true - validates :name, presence: true + validates :name, presence: true, uniqueness: { scope: :budget } + validates :slug, presence: true, format: /\A[a-z0-9\-_]+\z/ + end -end \ No newline at end of file +end diff --git a/app/models/budget/heading.rb b/app/models/budget/heading.rb index a81308947..1a232c75e 100644 --- a/app/models/budget/heading.rb +++ b/app/models/budget/heading.rb @@ -1,12 +1,15 @@ class Budget class Heading < ActiveRecord::Base + include Sluggable + belongs_to :group has_many :investments validates :group_id, presence: true - validates :name, presence: true + validates :name, presence: true, uniqueness: { if: :name_exists_in_budget_headings } validates :price, presence: true + validates :slug, presence: true, format: /\A[a-z0-9\-_]+\z/ delegate :budget, :budget_id, to: :group, allow_nil: true @@ -16,5 +19,9 @@ class Budget "#{group.name}: #{name}" end + def name_exists_in_budget_headings + group.budget.headings.where(name: name).any? + end + end end