66 votes

Modèle Rails sans base de données

Je veux créer un modèle Rails (2.1 et 2.2) avec des validations ActiveRecord, mais sans table de base de données. Quelle est l'approche la plus utilisée ? J'ai trouvé quelques plugins qui prétendent offrir cette fonctionnalité, mais beaucoup d'entre eux ne semblent pas être largement utilisés ou maintenus. Que me recommande la communauté ? Pour l'instant, je penche pour l'élaboration de ma propre solution basée sur les éléments suivants cet article de blog .

68voto

d135-1r43 Points 1387

Il existe une meilleure façon de procéder dans Rails 3 : http://railscasts.com/episodes/219-active-model

43voto

John Topley Points 58789

C'est une approche que j'ai utilisée dans le passé :

Sur app/models/tableless.rb

class Tableless < ActiveRecord::Base
  def self.columns
    @columns ||= [];
  end

  def self.column(name, sql_type = nil, default = nil, null = true)
    columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default,
      sql_type.to_s, null)
  end

  # Override the save method to prevent exceptions.
  def save(validate = true)
    validate ? valid? : true
  end
end

Sur app/models/foo.rb

class Foo < Tableless
  column :bar, :string  
  validates_presence_of :bar
end

Sur script/console

Loading development environment (Rails 2.2.2)
>> foo = Foo.new
=> #<Foo bar: nil>
>> foo.valid?
=> false
>> foo.errors
=> #<ActiveRecord::Errors:0x235b270 @errors={"bar"=>["can't be blank"]}, @base=#<Foo bar: nil>>

8voto

tpinto Points 99

Créez simplement un nouveau fichier se terminant par ".rb" en respectant les conventions auxquelles vous êtes habitué (singulier pour le nom du fichier et le nom de la classe, souligné pour le nom du fichier, minuscule pour le nom de la classe) dans votre répertoire "models/". La clé ici est de ne pas hériter votre modèle de ActiveRecord (car c'est AR qui vous donne la fonctionnalité de base de données). Ex : pour un nouveau modèle pour les voitures, créez un fichier appelé "car.rb" dans votre répertoire models/ et dans votre modèle :

class Car
    # here goes all your model's stuff
end

edit : btw, si vous voulez des attributs sur votre classe, vous pouvez utiliser ici tout ce que vous utilisez sur ruby, il suffit d'ajouter quelques lignes en utilisant "attr_accessor" :

class Car
    attr_accessor :wheels # this will create for you the reader and writer for this attribute
    attr_accessor :doors # ya, this will do the same

    # here goes all your model's stuff
end

edit #2 : après avoir lu le commentaire de Mike, je vous dirais de suivre son chemin si vous voulez toutes les fonctionnalités d'ActiveRecord mais pas de table sur la base de données. Si vous voulez juste une classe Ruby ordinaire, peut-être que vous trouverez cette solution meilleure ;)

8voto

Honza Points 2771

Je pense que l'article du blog que vous mettez en lien est la meilleure façon de procéder. Je suggérerais seulement de déplacer les méthodes stubées dans un module pour ne pas polluer votre code.

4voto

Laurent Farcy Points 452

Il y a un Vidéo d'écran sur le modèle d'enregistrement non actif, créé par Ryan Bates. Un bon point de départ.

Au cas où vous ne l'auriez pas déjà regardé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X