Quali sono le migliori pratiche per mantenere un elenco nel database in Rails?

0

Ho list box e relazioni modello nel database. Sto facendo le seguenti migrazioni per mantenere elenchi, rinominare elementi e aggiungere elementi:

  def up
    Fund.create min: 0, max: 1_000_000
    add_column :sectors, :order, :integer, default: 0
    Sector.create name: 'Agriculture', order: 1
    Sector.create name: 'Construction', order: 2
    Sector.find( 9).update! name: 'Consumer Products', order: 3  

Funzionerà finché non sarà necessario eseguire il rollback di una migrazione, quindi le chiavi primarie per le nuove righe in fase di sviluppo non corrisponderanno più a quelle in fase di staging o produzione. Ho pensato di installare ActiveAdmin, ma poi avrei dovuto cambiare manualmente 3 diversi database (dev / staging / prod). Entrambi i modi sembrano noiosi. Ho pensato a #delete_all ma ci sono vincoli di chiave esterna, e ci sono già utenti che usano gli elenchi in produzione. Esiste una convenzione Rails da aggiornare e aggiungere agli elenchi nel database?

Oh sì, ho anche provato a creare liste nel codice per mantenerle più facilmente, come

class Ownership
  include ActiveModel::Model
  attr_accessor :id, :name

  def self.all
    [
      { id: 1, name: 'Individual' },
      ...
   ].map { |v| Ownership.new v }
  end

  def self.find_by_id(id)
    Ownership.all.select do |v|
      v.id == id
    end
  end

Ma poi ogni volta che devo stampare uno dei valori, devo prima cercarlo per id . Quindi invece di @record.ownership.name devo usare @ownership = Ownership.find_by_id(@record.ownership_id); @ownership.name; .

Oh sì, l'ho fatto anche io, quando ho davvero bisogno di tempo, che è il peggiore:

User Model:
  @@list_options = %w[0 1-5 6-10 10+]
  def self.list_options
    @@list_options
  end

User View:
  =f.select :field_1yr, User.list_options.map.with_index{|x,i| [x,i]}
    
posta Chloe 21.09.2017 - 05:29
fonte

1 risposta

0

Ho dovuto fare quanto segue È altrettanto noioso, ma almeno non dipende dalla chiave primaria.

Sector.create name: 'Real Estate - Commercial', order: 20 
Sector.find_by_name('Real Estate (Residential/Commercial)').update! name: 'Real Estate - Residential', order: 21
...

Mi piace in questo modo, per usare un codice univoco, fisso, fisso per fare riferimento alla riga e avere una colonna order in modo da ordinare. Sebbene idealmente order sarà con incrementi di 10, per consentire inserimenti senza rinumerare tutto.

 id |      code      | order |                             name                             |         created_at         |         updated_at
----+----------------+-------+--------------------------------------------------------------+----------------------------+----------------------------
  1 | finance        |     1 | Financial Services                                           | 2017-12-17 04:11:02.818388 | 2017-12-17 04:11:02.818388
  2 | energy         |     2 | Energy                                                       | 2017-12-17 04:11:02.823391 | 2017-12-17 04:11:02.823391
  3 | waste          |     3 | Waste to Energy Technologies                                 | 2017-12-17 04:11:02.828391 | 2017-12-17 04:11:02.828391
    
risposta data 21.09.2017 - 20:56
fonte