2008-11-24 57 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

相關問題