我想用ActiveRecord验证创建一个Rails(2.1和2.2)模型,但没有数据库表。什么是最广泛使用的方法?我发现一些宣称提供这种功能的插件,但其中许多插件似乎没有被广泛使用或维护。社群建议我做什么?现在我倾向于根据this blog post提出我自己的解决方案。没有数据库的Rails模型
回答
只需在您的“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类,也许你会发现这个解决方案更好;)
但这不会给他AR验证。 – 2008-11-25 01:15:22
好点。我敢打赌,这两种解决方案都有很多用例:) – tpinto 2008-11-25 01:25:02
将类标记为抽象是什么?
class Car < ActiveRecord::Base
self.abstract = true
end
这会告诉导轨Car类没有对应的表。
[编辑]
这不会真正帮助你,如果你需要做的是这样:
my_car = Car.new
有一个关于非活动记录模型的screencast,由Ryan Bates组成。一个好的开始。
以防万一你还没有看过它。
再次,这并不能解决使用AR验证的海报问题。 – 2008-11-25 18:16:58
像Tiago Pinto说的那样,只是没有从ActiveRecord :: Base继承你的模型。它只是一个常规的Ruby类,您可以将它粘在app/models /目录中的文件中。如果没有你的模型有表,你不是在你的应用程序中使用一个数据库或ActiveRecord的根本,一定要修改您的environment.rb文件中有如下一行:
config.frameworks -= [:active_record]
这应该是内Rails::Initializer.run do |config|
块。
这是我在过去使用的方法:
在应用程序/模型/ 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>>
有人曾经试图在包括非Active Record类ActiveRecord::Validations
和ActiveRecord::Validations::ClassMethods
,看看试图安装验证时会发生什么?
我确定验证框架和ActiveRecord本身之间有很多依赖关系。但是,您可以通过从AR验证框架中派生出自己的验证框架来成功摆脱这些依赖关系。
只是一个想法。
更新:oopps,这或多或少是与您的问题相关的帖子中建议的内容。对不起,打扰了。
使用Validatable gem。正如你所说,有基于AR的解决方案,但它们往往是脆弱的。
你应该检出PassiveRecord插件。它为您提供了一个非数据库模型的类似ActiveRecord的界面。这很简单,而且比打ActiveRecord少麻烦。
我们将PassiveRecord与Validatable gem结合使用,以获得OP的预期行为。
根据John Topley的建议,我已经构建了一个快速Mixin来处理这个问题。
有一个更好的方式Rails 3中做到这一点:http://railscasts.com/episodes/219-active-model
现在有更简单的方法:
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
- 1. 模型在rails上返回数据ruby没有数据ruby
- 2. 没有数据库和模型更新的动态数据
- 3. Ruby on Rails模型/数据库协会
- 4. Rails数据库/模型架构约定
- 5. 如何在没有数据库的Ruby on Rails上使用我的模型?
- 6. 注册有和没有地址的MySQL数据库模型
- 7. Rails模型生成器 - 从现有的数据库
- 8. ruby rails migrate没有更新数据库
- 9. JRuby on Rails没有数据库
- 10. rails部署 - 数据库没有上传
- 11. 保存的Python模型没有引用正确的数据库
- 12. rails g脚手架现有模型和数据库表
- 13. rails 3:如何为现有数据库表生成模型
- 14. 没有迁移的模型。 Rails的
- 15. 有用的库存SQL数据模型?
- 16. 从没有系统表的数据库更新模型?
- 17. CakePHP 2.0 - 没有底层数据库表的插件模型
- 18. 没有数据库模型的Django LDAP认证
- 19. 没有数据库/框架的Asp.net mvc模型
- 20. Ruby on Rails:没有表格的模型
- 21. 没有南数据库模块'south.db.postgresql_psycopg2'为您的数据库
- 22. 将Rails模型连接到非Rails数据库
- 23. 保存简单的数据在Magento的数据库没有模型
- 24. 将数据存储在没有数据库的Ruby on Rails中
- 25. CouchDB的数据库模型
- 26. 我没有发现,在实体数据模型C#的Visual Studio数据库
- 27. 如何用Minitest和没有数据库测试模型?
- 28. Django数据库API(模型层)没有安装Django?
- 29. 数据库没有在MVC中更新模型
- 30. Django模型子类没有改变数据库名称
博客文章已链接已死亡。 – 2011-02-04 13:29:57
http://www.prestonlee.com/2007/12/29/rails-20-validations-without-extending-activerecordbase/,但仍以新名称活着。 – 2011-03-21 19:22:00
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