mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-15 04:21:41 +00:00
WIP migrar a roles
This commit is contained in:
parent
e485971940
commit
4fee63acb6
6 changed files with 58 additions and 50 deletions
|
@ -8,8 +8,7 @@ class SitesController < ApplicationController
|
||||||
# Ver un listado de sitios
|
# Ver un listado de sitios
|
||||||
def index
|
def index
|
||||||
authorize Site
|
authorize Site
|
||||||
@sites = [current_usuarie.sites,
|
@sites = current_usuarie.sites
|
||||||
current_usuarie.sites_as_invitade].flatten
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# No tenemos propiedades de un sitio aún, así que vamos al listado de
|
# No tenemos propiedades de un sitio aún, así que vamos al listado de
|
||||||
|
|
|
@ -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
|
|
|
@ -9,8 +9,5 @@ class Usuarie < ApplicationRecord
|
||||||
validates_uniqueness_of :email
|
validates_uniqueness_of :email
|
||||||
|
|
||||||
has_many :roles
|
has_many :roles
|
||||||
has_and_belongs_to_many :sites
|
has_many :sites, through: :roles
|
||||||
has_and_belongs_to_many :sites_as_invitade,
|
|
||||||
class_name: 'Site',
|
|
||||||
join_table: 'invitades_sites'
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
# Crea la tabla de roles
|
# Crea la tabla de roles
|
||||||
class CreateRoles < ActiveRecord::Migration[5.2]
|
class CreateRoles < ActiveRecord::Migration[5.2]
|
||||||
def change
|
def up
|
||||||
create_table :roles do |t|
|
create_table :roles do |t|
|
||||||
t.timestamps
|
t.timestamps
|
||||||
t.belongs_to :site
|
t.belongs_to :site
|
||||||
|
@ -14,4 +14,6 @@ class CreateRoles < ActiveRecord::Migration[5.2]
|
||||||
t.index %i[site_id usuarie_id], unique: true
|
t.index %i[site_id usuarie_id], unique: true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def down; end
|
||||||
end
|
end
|
||||||
|
|
52
db/migrate/20190706002615_migrate_from_habtm_to_roles.rb
Normal file
52
db/migrate/20190706002615_migrate_from_habtm_to_roles.rb
Normal 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
|
14
db/schema.rb
14
db/schema.rb
|
@ -12,13 +12,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 20_190_706_000_159) do
|
ActiveRecord::Schema.define(version: 20_190_706_002_615) 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
|
|
||||||
|
|
||||||
create_table 'roles', force: :cascade do |t|
|
create_table 'roles', force: :cascade do |t|
|
||||||
t.datetime 'created_at', null: false
|
t.datetime 'created_at', null: false
|
||||||
t.datetime 'updated_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'
|
t.index ['name'], name: 'index_sites_on_name'
|
||||||
end
|
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|
|
create_table 'usuaries', force: :cascade do |t|
|
||||||
t.datetime 'created_at', null: false
|
t.datetime 'created_at', null: false
|
||||||
t.datetime 'updated_at', null: false
|
t.datetime 'updated_at', null: false
|
||||||
|
|
Loading…
Reference in a new issue