WIP migrar a roles

This commit is contained in:
f 2019-07-08 13:40:41 -03:00
parent e485971940
commit 4fee63acb6
No known key found for this signature in database
GPG key ID: 2AE5A13E321F953D
6 changed files with 58 additions and 50 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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