2008-11-24 74 views
59

我想用ActiveRecord验证创建一个Rails(2.1和2.2)模型,但没有数据库表。什么是最广泛使用的方法?我发现一些宣称提供这种功能的插件,但其中许多插件似乎没有被广泛使用或维护。社群建议我做什么?现在我倾向于根据this blog post提出我自己的解决方案。没有数据库的Rails模型

+1

博客文章已链接已死亡。 – 2011-02-04 13:29:57

+1

http://www.prestonlee.com/2007/12/29/rails-20-validations-without-extending-activerecordbase/,但仍以新名称活着。 – 2011-03-21 19:22:00

+0

http://web.archive.org/web/20100716123520/http://www.prestonlee.com/2007/12/29/rails-20-validations-without-extending-activerecordbase/因为它似乎再次下降 – GDR 2011-10-03 23:44:40

回答

8

我想你链接的博客文章是最好的一段路要走。我只会建议将残存的方法移动到不污染代码的模块中。

+0

我与Honza合作,如果您需要在您的POCO中进行AR的验证,我认为该文章是您唯一的选择。祝你好运。 – 2008-11-25 18:18:44

+0

我继续做下去。非常适合我的需求。谢谢。 – FlipFlop 2009-02-04 03:38:32

+11

当我访问时,这篇文章可能会丢失吗? – sarunw 2009-11-06 07:20:17

8

只需在您的“models /”目录下创建一个以“.rb”结尾的新文件,遵循您习惯的约定(单数为文件名和类名,文件名的下划线,类名的驼峰大小写) 。这里的关键是不从ActiveRecord继承你的模型(因为它是AR为你提供数据库功能)。 如:

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

编辑:针对汽车的新模式,在您的模型/目录和模型中创建一个名为“car.rb”文件顺便说一句,如果你想在你的类属性,你可以这里使用你的Ruby使用一切,只需要添加使用“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 

编辑#2:阅读Mike的意见后,我会告诉你去他的方式,如果你想所有的ActiveRecord的功能但数据库上没有表格。如果你只是想要一个普通的Ruby类,也许你会发现这个解决方案更好;)

+2

但这不会给他AR验证。 – 2008-11-25 01:15:22

+0

好点。我敢打赌,这两种解决方案都有很多用例:) – tpinto 2008-11-25 01:25:02

2

将类标记为抽象是什么?

class Car < ActiveRecord::Base 
    self.abstract = true 
end 

这会告诉导轨Car类没有对应的表。

[编辑]

这不会真正帮助你,如果你需要做的是这样:

my_car = Car.new 
4

有一个关于非活动记录模型的screencast,由Ryan Bates组成。一个好的开始。

以防万一你还没有看过它。

+0

再次,这并不能解决使用AR验证的海报问题。 – 2008-11-25 18:16:58

0

像Tiago Pinto说的那样,只是没有从ActiveRecord :: Base继承你的模型。它只是一个常规的Ruby类,您可以将它粘在app/models /目录中的文件中。如果没有你的模型有表,你不是在你的应用程序中使用一个数据库或ActiveRecord的根本,一定要修改您的environment.rb文件中有如下一行:

config.frameworks -= [:active_record] 

这应该是内Rails::Initializer.run do |config|块。

43

这是我在过去使用的方法:

应用程序/模型/ 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 

应用程序/模型/ foo中。RB

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

脚本/控制台

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>> 
1

有人曾经试图在包括非Active Record类ActiveRecord::ValidationsActiveRecord::Validations::ClassMethods,看看试图安装验证时会发生什么?

我确定验证框架和ActiveRecord本身之间有很多依赖关系。但是,您可以通过从AR验证框架中派生出自己的验证框架来成功摆脱这些依赖关系。

只是一个想法。

更新:oopps,这或多或少是与您的问题相关的帖子中建议的内容。对不起,打扰了。

0

你应该检出PassiveRecord插件。它为您提供了一个非数据库模型的类似ActiveRecord的界面。这很简单,而且比打ActiveRecord少麻烦。

我们将PassiveRecord与Validatable gem结合使用,以获得OP的预期行为。

15

现在有更简单的方法:

class Model 
    include ActiveModel::Model 

    attr_accessor :var 

    validates :var, presence: true 
end 

ActiveModel::Model代码:

module ActiveModel 
    module Model 
    def self.included(base) 
     base.class_eval do 
     extend ActiveModel::Naming 
     extend ActiveModel::Translation 
     include ActiveModel::Validations 
     include ActiveModel::Conversion 
     end 
    end 

    def initialize(params={}) 
     params.each do |attr, value| 
     self.public_send("#{attr}=", value) 
     end if params 
    end 

    def persisted? 
     false 
    end 
    end 
end 

http://api.rubyonrails.org/classes/ActiveModel/Model.html

2

为了完整起见:

的Rails现在(在V5)有一个方便的模块可以包括:

include ActiveModel::Model

这可以让你用哈希初始化,并使用验证之中其他事情。

完整文档是here

相关问题