Question

Ma DB tables et les noms de champ sont en CamelCase.Est-il possible de convertir ces noms snake_case sur une mouche?Pour rendre les méthodes de model look assez?

L'application est JRubyOnRails 3.0 / MSSQL DB / ActiveRecord-JDBC-adaptateur.

Était-ce utile?

La solution

@arkadi,comme une question de fait, j'ai été à la recherche dans ce juste à ce jour.

Pour les noms de table, nous avons bien sûr la set_table_name méthode:

class CamelCasedFoo < ActiveRecord::Base
  set_table_name :CamelCasedTable
end

Pour des choses comme des clés primaires, nous avons set_primary_key:

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

Et il devrait être possible de faire un alias de funky, de l'héritage des noms de colonne à quelque chose de plus rails de l'environnement grâce à alias_attribute:

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

Un truc important à garder à l'esprit est de regarder dehors pour les noms de colonnes sont ruby ou rails mots-clés ou la magie des noms de champ.

Rails semble avoir tout ce que la métaprogrammation la bonté de vous permettre de travailler autour de l'héritage db noms de tables et de colonnes.Vous pouvez avoir une lecture de Jonathan Hui le billet de blog de "Ruby on Rails 3 Modèle de Travail avec l'Héritage de la Base de données".Et vous pouvez avoir un coup d'oeil à la safe_attributes gem.

Autres conseils

J'ai eu le même besoin. @ Réponse de Buruzaemon de la définition du nom de la table et primaire_key est bonne mais j'ai quelques suggestions pour le rendre meilleur.

Je pense que les méthodes de style SET_ * sont tombées hors de faveur et simplement définir l'attribut directement est recommandée ces jours-ci. Donc

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

En outre, en utilisant alias_attribute pour alias manuellement, chaque attribut semble fastidieux. Il semble également que cela puisse être facile à oublier un. Bien que @Behrangf recommande à ce sujet, je ne vois rien de mal à utiliser une petite magie méta-programmation pour fournir automatiquement la version Snake_Case de vos attributs. J'ai créé un module qui le fait automatiquement. Il n'est même pas attaché à ActiveRecord pour que vous puissiez également l'utiliser dans une enveloppe d'API ou autre chose qui reflète un système qui ne suit pas les conventions de rubis. Je suive le module sur le gis, mais la commodité est reproduite ci-dessous:

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

Ce module dépend de la méthode camelize d'ActiveSupport.

yuck!Vous avez ma sympathie.J'aime Old_school.names tout le temps, même lorsque le moteur permet d'autres malarkey ...

Je suppose que c'est une application héritée?

Que diriez-vous de créer un ensemble de vues pour votre application Rails pour travailler?

Ruby on Rails est opiniâtre logiciel.Cela signifie que ses concepteurs ont choisi de faire les choses d'une manière spécifique et afin d'être en mesure d'utiliser RoR avec succès, le plaisir, la simplicité, la douceur, etc.vous doit faire dans cette manière spécifique.En tant que tel, si vous ne pouvez pas ou ne voulez pas suivre RoR de la table et de la colonne des conventions de nommage, nous vous conseillons de sélectionner un autre cadre.

Toutefois, si vous voulez rester avec RoR encore vous voulez snake_case les noms de méthode, vous pouvez ouvrir le ActiveRecord::Base de classe, d'intercepter les appels à undefined méthodes, de s'assurer qu'ils correspondent à la ^[a-z]+(_[a-z]+)*$ exception régulière, et si oui, de les convertir à la partie supérieure du cas et appel à la supérieure de la méthode d'étude de cas. MAIS JE VOUS CONSEILLE FORTEMENT DE NE PAS LE FAIRE!!!* :D

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top