mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-15 02:41: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
|
||||
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
|
||||
|
|
|
@ -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
|
||||
|
||||
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
|
||||
|
|
|
@ -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
|
||||
|
|
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.
|
||||
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue