我想用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 3 - 如何驗證沒有數據庫的模型?
- 2. Ruby on Rails模型保存rest_client沒有本地數據庫
- 3. 沒有表驗證模型數據庫
- 4. Rails - 更新數據庫中的模型
- 5. 模型在rails上返回數據ruby沒有數據ruby
- 6. 沒有數據庫和模型更新的動態數據
- 7. Rails:模型和數據庫表
- 8. Rails數據庫/模型架構約定
- 9. Rails更新數據庫,更改模型
- 10. Ruby on Rails模型/數據庫協會
- 11. 如何在沒有數據庫的Ruby on Rails上使用我的模型?
- 12. 沒有數據庫的Rails控制器
- 13. 如何從沒有模型的Rails應用程序中查詢MySQL數據庫?
- 14. 在沒有數據庫交互的情況下使用Rails模型
- 15. 註冊有和沒有地址的MySQL數據庫模型
- 16. Rails模型生成器 - 從現有的數據庫
- 17. Rails - 將數據庫/模型與非數據庫表的模塊關聯
- 18. 如果保存模型時沒有更改,Rails/ActiveRecord會訪問數據庫嗎?
- 19. Rails - 如何從模型創建數據庫表(我沒有遷移腳本)
- 20. JRuby on Rails沒有數據庫
- 21. ruby rails migrate沒有更新數據庫
- 22. rails部署 - 數據庫沒有上傳
- 23. Django沒有爲模型創建數據庫表(既沒有syncdb也沒有南)
- 24. 保存的Python模型沒有引用正確的數據庫
- 25. 沒有數據庫的模型:未初始化的常量
- 26. rails 3:如何爲現有數據庫表生成模型
- 27. rails g腳手架現有模型和數據庫表
- 28. 沒有遷移的模型。 Rails的
- 29. 有用的庫存SQL數據模型?
- 30. 沒有填充數據的模型?
博客文章已鏈接已死亡。 – 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