From 4fee63acb665307356dde73a5a55916a79ee7ee8 Mon Sep 17 00:00:00 2001 From: f Date: Mon, 8 Jul 2019 13:40:41 -0300 Subject: [PATCH] WIP migrar a roles --- app/controllers/sites_controller.rb | 3 +- app/models/usuaria.rb | 30 ----------- app/models/usuarie.rb | 5 +- db/migrate/20190706000159_create_roles.rb | 4 +- ...90706002615_migrate_from_habtm_to_roles.rb | 52 +++++++++++++++++++ db/schema.rb | 14 +---- 6 files changed, 58 insertions(+), 50 deletions(-) delete mode 100644 app/models/usuaria.rb create mode 100644 db/migrate/20190706002615_migrate_from_habtm_to_roles.rb diff --git a/app/controllers/sites_controller.rb b/app/controllers/sites_controller.rb index e9daeb3..6ca91f1 100644 --- a/app/controllers/sites_controller.rb +++ b/app/controllers/sites_controller.rb @@ -8,8 +8,7 @@ class SitesController < ApplicationController # Ver un listado de sitios def index authorize Site - @sites = [current_usuarie.sites, - current_usuarie.sites_as_invitade].flatten + @sites = current_usuarie.sites end # No tenemos propiedades de un sitio aún, así que vamos al listado de diff --git a/app/models/usuaria.rb b/app/models/usuaria.rb deleted file mode 100644 index 707c7b2..0000000 --- a/app/models/usuaria.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -# Un modelo para la usuaria que no se corresponde con una base de datos -# porque vienen de IMAP -# -# Una usuaria puede tener muchos sitios, pero no podemos establecer -# relaciones estilo has_many porque no estamos usando ActiveRecord, que -# requeriría que guardemos todo en una base de datos. -class Usuaria < OpenStruct - # Crear una usuaria ad hoc, porque la base de datos de usuarias está - # en otro lado. - def self.find(username) - Usuaria.new(username: username) - end - - def path - File.join(Rails.root, '_usuarias', username) - end - - def site_dirs - Pathname.new(path).children.map(&:expand_path).map(&:to_s) - end - - # Obtener todos los sitios de esta usuaria - def sites - @sites ||= site_dirs.map do |site| - Site.find(File.basename(site)) - end.compact - end -end diff --git a/app/models/usuarie.rb b/app/models/usuarie.rb index 7f754b3..827cf5a 100644 --- a/app/models/usuarie.rb +++ b/app/models/usuarie.rb @@ -9,8 +9,5 @@ class Usuarie < ApplicationRecord validates_uniqueness_of :email has_many :roles - has_and_belongs_to_many :sites - has_and_belongs_to_many :sites_as_invitade, - class_name: 'Site', - join_table: 'invitades_sites' + has_many :sites, through: :roles end diff --git a/db/migrate/20190706000159_create_roles.rb b/db/migrate/20190706000159_create_roles.rb index 231dff2..03f7293 100644 --- a/db/migrate/20190706000159_create_roles.rb +++ b/db/migrate/20190706000159_create_roles.rb @@ -2,7 +2,7 @@ # Crea la tabla de roles class CreateRoles < ActiveRecord::Migration[5.2] - def change + def up create_table :roles do |t| t.timestamps t.belongs_to :site @@ -14,4 +14,6 @@ class CreateRoles < ActiveRecord::Migration[5.2] t.index %i[site_id usuarie_id], unique: true end end + + def down; end end diff --git a/db/migrate/20190706002615_migrate_from_habtm_to_roles.rb b/db/migrate/20190706002615_migrate_from_habtm_to_roles.rb new file mode 100644 index 0000000..7ebbad1 --- /dev/null +++ b/db/migrate/20190706002615_migrate_from_habtm_to_roles.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +# Nos movemos de HABTM a una tabla de roles que nos permite tener otras +# características. +# +# No usamos ninguna feature de los modelos porque podemos haber borrado +# código. No queremos tener migraciones que luego no funcionen. +class MigrateFromHabtmToRoles < ActiveRecord::Migration[5.2] + def up + Site.all.each do |site| + %w[usuarie invitade].each do |rol| + table_name = rol.pluralize + join_table = ['sites', table_name].sort.join('_') + + usuaries = Usuarie.find_by_sql("select usuaries.* + from usuaries + inner join #{join_table} + on #{join_table}.usuarie_id = usuaries.id + where #{join_table}.site_id = #{site.id}") + + usuaries.each do |usuarie| + site.roles << Rol.create(site: site, usuarie: usuarie, + temporal: false, rol: rol) + end + end + end + + drop_table :sites_usuaries + drop_table :invitades_sites + end + + def down + %i[sites_usuaries invitades_sites].each do |table| + create_table table, id: false do |t| + t.belongs_to :site + t.belongs_to :usuarie + t.index %i[site_id usuarie_id], unique: true + end + end + + Rol.all.each do |rol| + table_name = ['sites', rol.rol.pluralize].sort.join('_') + + sql = "insert into #{table_name} (site_id, usuarie_id) + values (#{rol.site_id}, #{rol.usuarie_id});" + + ActiveRecord::Base.connection.execute(sql) + end + + drop_table :roles + end +end diff --git a/db/schema.rb b/db/schema.rb index 34a38a8..6e3c298 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -12,13 +12,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20_190_706_000_159) do - create_table 'invitades_sites', id: false, force: :cascade do |t| - t.integer 'site_id' - t.integer 'usuarie_id' - t.index %w[site_id usuarie_id], name: 'index_invitades_sites_on_site_id_and_usuarie_id', unique: true - end - +ActiveRecord::Schema.define(version: 20_190_706_002_615) do create_table 'roles', force: :cascade do |t| t.datetime 'created_at', null: false t.datetime 'updated_at', null: false @@ -38,12 +32,6 @@ ActiveRecord::Schema.define(version: 20_190_706_000_159) do t.index ['name'], name: 'index_sites_on_name' end - create_table 'sites_usuaries', id: false, force: :cascade do |t| - t.integer 'site_id' - t.integer 'usuarie_id' - t.index %w[site_id usuarie_id], name: 'index_sites_usuaries_on_site_id_and_usuarie_id', unique: true - end - create_table 'usuaries', force: :cascade do |t| t.datetime 'created_at', null: false t.datetime 'updated_at', null: false