当前位置:  开发笔记 > 编程语言 > 正文

没有数据库的Rails模型

如何解决《没有数据库的Rails模型》经验,为你挑选了6个好方法。

我想用ActiveRecord验证创建一个Rails(2.1和2.2)模型,但没有数据库表.什么是最广泛使用的方法?我发现一些声称提供此功能的插件,但其中许多插件似乎没有得到广泛使用或维护.社区推荐我做什么?现在我倾向于根据这篇博文提出我自己的解决方案.



1> d135-1r43..:

有一种更好的方式在Rails 3中做到这一点:http://railscasts.com/episodes/219-active-model


在Rails 4中还有ActiveModel :: Model,其中包含许多ActiveModel模块和一些其他魔法,让您感觉像ActiveRecord模型一样(非持久化或自定义持久化)模型.

2> John Topley..:

这是我过去使用的一种方法:

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

app/models/foo.rb中

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

脚本/控制台中

Loading development environment (Rails 2.2.2)
>> foo = Foo.new
=> #
>> foo.valid?
=> false
>> foo.errors
=> #["can't be blank"]}, @base=#>


效果很好,非常轻巧.Rails 2.3会抱怨脚本/控制台缺少一个表,但添加"self.abstract_class = true"可以解决这个问题(不会阻止实例化).
@David James:哪些?

3> hlcs..:

现在有更简单的方法:

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


这是现在的方法

4> tpinto..:

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

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

编辑:顺便说一句,如果你想要你的类的属性,你可以在这里使用你在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验证.

5> Honza..:

我认为您链接的博客文章是最好的方式.我只建议将已删除的方法移动到一个模块中,以免污染您的代码.


我访问的帖子丢失了你可以在这里发帖吗?

6> xmjw..:

为了完整性:

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

include ActiveModel::Model

这使您可以使用哈希进行初始化,以及使用验证等功能。

完整的文档在这里。

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有