Domanda

Le mie tabelle DB e i nomi dei campi sono in Camelcase. È possibile convertire quei nomi in Snake_Case su una mosca? Per rendere i metodi del modello belli?

L'app è JRUBYONRAILS 3.0 / MSSQL DB / ACTIVERECORD-JDBC-Adapter.

È stato utile?

Soluzione

@Arkadiy, in realtà, lo stavo esaminando proprio questo giorno.

Per i nomi delle tabelle, ovviamente abbiamo il set_table_name metodo:

class CamelCasedFoo < ActiveRecord::Base
  set_table_name :CamelCasedTable
end

Per cose come le chiavi primarie, abbiamo set_primary_key:

class CamelCasedBar < ActiveRecord::Base
  ...
  set_primary_key "CamelCasedTableID"
end

E dovrebbe essere possibile alias funky, nomi di colonne legacy a qualcosa di più adatto alle rotaie alias_attribute:

class CamelCasedBaz < ActiveRecord::Base
  ...
  alias_attribute :preferred_delivery, :DeliveryFrequency
end

Una cosa chiave da tenere a mente è stare attento a eventuali nomi di colonne Ruby o Rails Parole chiave o Nomi dei campi magici.

Le rotaie sembra avere tutto ciò che metaprogrammazione di bontà per permetterti di aggirare i nomi e le colonne della tabella DB legacy. Potresti voler leggere il post sul blog di Jonathan Hui su "Modello Ruby on Rails 3 che lavora con il database legacy". E potresti voler dare un'occhiata al Safe_attributes gemma.

Altri suggerimenti

Avevo la stessa necessità. La risposta di Buruzaemon sull'impostazione di table_name e primary_key è buona, ma ho alcuni suggerimenti per migliorarlo.

Credo che i metodi SET_* Style siano caduti in disgrazia e si consiglia semplicemente di impostare direttamente l'attributo in questi giorni. Così

class Project < ActiveRecord::Base
  self.table_name = 'Projects'
  self.primary_key = 'ProjectId'
end

Inoltre, usando alias_attribute per alias manualmente ogni attributo sembra noioso. Sembra anche che potrebbe essere facile dimenticarne uno. Sebbene @Behrangf consigliasse contro di esso, non vedo nulla di sbagliato nell'uso di un po 'di magia meta-programmare per fornire automaticamente la versione Snake_Case dei tuoi attributi. Ho creato un modulo Questo lo fa automaticamente. Non è nemmeno legato ad ActiveRecord, quindi potresti anche usarlo in un involucro API o qualcos'altro che rispecchia un sistema che non segue le convenzioni di Ruby. Sto monitorando il modulo su GIST ma per comodità è riprodotto di seguito:

module Snakeable

  # Patch in our automatic snake_case methods
  def method_missing method, *args 
    if is_snake_case?(method) &&
      respond_to?(camelized = method.to_s.camelize.to_sym)
      send camelized, *args
    else
      super
    end
  end

  # So the object including this module will respond to
  # Object#respond_to? correctly
  def respond_to? method, *args
    super || (
      is_snake_case?(method) &&
      super(method.to_s.camelize.to_sym, *args)
    )
  end

  private

  # Is the given method using the snake_case format
  def is_snake_case? method
    method.to_s =~ /^[a-z]+(?:_[a-z]+)*[?=!]?$/
  end

end

Questo modulo dipende da ActiveSupport camelize metodo.

Che schifo! Hai la mia simpatia. Mi piace old_school.names tutto il tempo, anche quando il motore consente altri malarkey ...

Presumo che questa sia un'app legacy?

Che ne dici di creare una serie di visualizzazioni per la tua app Rails con cui lavorare?

Ruby on Rails è software supponente. Significa che i suoi designer hanno scelto di fare le cose in modo specifico e per poter usare ROR con successo, piacere, facilità, morbidezza, ecc. dovere Fallo in quel modo specifico. Pertanto, se non puoi o non vuoi seguire le convenzioni di nomina della tabella e della colonna di Ror, ti consigliamo di selezionare un altro framework.

Tuttavia, se vuoi stare con Ror, ma vuoi snake_case Nomi dei metodi, puoi aprire il ActiveRecord::Base classe, intercettazioni chiama a metodi non definiti, assicurarsi che corrispondano al ^[a-z]+(_[a-z]+)*$ Eccezione regolare e, in tal caso, convertili in maiuscolo e chiama il metodo maiuscolo. Ma ti consiglio vivamente di non farlo !!!* :D

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top