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 .
Réponses
Trop de publicités?Il existe une meilleure façon de procéder dans Rails 3 : http://railscasts.com/episodes/219-active-model
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>>
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 ;)
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é.