diff --git a/app/controllers/admin/reserved_domains_controller.rb b/app/controllers/admin/reserved_domains_controller.rb index 430fb9d8a..57e4b8ed3 100644 --- a/app/controllers/admin/reserved_domains_controller.rb +++ b/app/controllers/admin/reserved_domains_controller.rb @@ -2,9 +2,9 @@ class Admin::ReservedDomainsController < AdminController load_and_authorize_resource def index - rd = ReservedDomain.first_or_initialize - rd.names = nil if rd.names.blank? - @reserved_domains = rd.names.to_yaml.gsub(/---.?\n/, '').gsub(/\.\.\..?\n/, '') + names = ReservedDomain.pluck(:names).each_with_object({}){|e_h,h| h.merge!(e_h)} + names.names = nil if names.blank? + @reserved_domains = names.to_yaml.gsub(/---.?\n/, '').gsub(/\.\.\..?\n/, '') end def create @@ -20,9 +20,27 @@ class Admin::ReservedDomainsController < AdminController render :index and return end - rd = ReservedDomain.first_or_create + result = true + ReservedDomain.transaction do + # removing old ones + existing = ReservedDomain.any_of_domains(names.keys).pluck(:id) + ReservedDomain.where.not(id: existing).delete_all - if rd.update(names: names) + #updating and adding + names.each do |name, psw| + rec = ReservedDomain.by_domain(name).first + rec ||= ReservedDomain.new + rec.names = {name => psw} + + unless rec.save + result = false + raise ActiveRecord::Rollback + end + end + end + + + if result flash[:notice] = I18n.t('record_updated') redirect_to :back else diff --git a/app/models/reserved_domain.rb b/app/models/reserved_domain.rb index 6684d6541..936c744bf 100644 --- a/app/models/reserved_domain.rb +++ b/app/models/reserved_domain.rb @@ -9,7 +9,15 @@ class ReservedDomain < ActiveRecord::Base class << self def pw_for(domain_name) - select("names -> '#{domain_name}' AS pw").first.try(:pw) + by_domain(domain_name).select("names -> '#{domain_name}' AS pw").first.try(:pw) + end + + def by_domain name + where("names ? '#{name}'") + end + + def any_of_domains names + where("names ?| ARRAY['#{names.join("','")}']") end end end