2010-02-06 58 views
99

現在Rails 3 beta已經不存在了,我想我應該看看重寫一個我剛剛開始在Rails 3 beta中工作的應用程序,以便獲得它的感覺並獲得一點的領先。該應用程序使用MongoDB和MongoMapper爲其所有模型,因此不需要ActiveRecord。在以前的版本中,我卸載的ActiveRecord以下列方式:在Rails 3中刪除ActiveRecord 3

config.frameworks -= [ :active_record ] # inside environment.rb 

在最新版本中,這並不工作 - 它只是拋出一個錯誤:

/Library/Ruby/Gems/1.8/gems/railties-3.0.0.beta/lib/rails/configuration.rb:126:in 
    `frameworks': config.frameworks in no longer supported. See the generated 
    config/boot.rb for steps on how to limit the frameworks that will be loaded 
    (RuntimeError) 
from *snip* 

當然,我已經看過正如它所建議的boot.rb,但據我所知,這裏沒有關於如何去卸載AR的線索。我需要這樣做的原因是因爲加載我不想要的東西不僅是愚蠢的,而且它抱怨說即使在我嘗試爲控制器運行生成器時也無法建立數據庫連接。這是因爲我已經擦除了database.yml並用MongoDB的連接細節替換它,以便使用this gist來爲database.yml使用MongoDB連接詳細信息。不知道爲什麼它需要能夠發起一個數據庫連接,只是爲了生成一個控制器呢......

是否有人知道正確的Rails 3做到這一點?

回答

155

我正在閱讀源代碼,所以讓我知道它是否真的有效。 :)

生成應用程序模板的rails命令現在有一個選項-O,它告訴它跳過ActiveRecord。

如果你不喜歡重新運行rails,你應該檢查在您現有的應用程序如下:

  • 檢查您的config/application.rbrequire 'rails/all'require "active_record/railtie"。相反,對於沒有ActiveRecord的標準Rails的設置,它應該有以下要求:

    require File.expand_path('../boot', __FILE__) 
    
    require "action_controller/railtie" 
    require "action_mailer/railtie" 
    require "active_resource/railtie" 
    require "rails/test_unit/railtie" 
    require "sprockets/railtie" 
    
    # Auto-require default libraries and those for the current Rails environment. 
    Bundler.require :default, Rails.env 
    
  • 如果在config/application.rb,您使用的是config.generators部分,確保它不具備行g.orm :active_record 。如果需要,您可以將其明確設置爲nil,但在完全省略g.orm時應該將其設置爲默認值。

  • 可選,但在您的Gemfile中,刪除加載數據庫模塊的gem行。例如,這可以是行gem "mysql"

+3

是啊,這似乎已經做到了。看起來-O選項也可以被調用爲'--skip-activerecord'。我使用此選項爲其他(臨時)應用程序運行rails命令,並生成了與上面所寫的完全匹配的新應用程序模板。所以我可以將這些更改複製並粘貼到我的實際應用程序中。謝謝 - 很好找到:) – 2010-02-06 11:36:52

+1

非常好 - 感謝--skip-activerecord。這正是我需要的。 – Finglas 2010-11-09 13:34:40

+0

大部分工作,除了當我運行rails生成 - 我仍然看到ActiveRecord的東西 - 如何刪除它? – Hackeron 2011-01-11 19:52:26

6

以上都是真實的。還有一件事我不得不在rails 3.1中註釋

config.active_record.identity_map = true 

in config/application.rb

36

對於新的rails應用程序,可以通過指定--skip-active-record參數來排除活動記錄。例如:

rails new appname --skip-active-record 
+0

我做了這個,並跑了幾個差異來找到並刪除我當前使用ActiveRecord的應用程序中的東西 – 2013-04-05 18:32:51

15

如果您生成使用Rails 3.2,你還需要註釋掉一個新項目:

config.active_record.mass_assignment_sanitizer = :strict 

config.active_record.auto_explain_threshold_in_seconds = 0.5 

development.rb文件。

1

而且評論

# config/application.rb  
config.active_record.whitelist_attributes = true 

2

如果你正在運行rspec的,你還需要刪除(在spec_helper)(上軌3.2.13所示):

# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures 
    config.fixture_path = "#{::Rails.root}/spec/fixtures" 

並刪除

# If you're not using ActiveRecord, or you'd prefer not to run each of your 
    # examples within a transaction, remove the following line or assign false 
    # instead of true. 
    config.use_transactional_fixtures = true 
45

軌道4

我一直在尋找如何在軌道4禁用它,才發現這個答案不再在軌工作4。因此,這是你怎麼能在軌道4,5做到這一點(在RC1測試)。

在一個新的項目

rails new YourProject --skip-active-record 

在現有項目

  • 在你的Gemfile,刪除數據庫驅動程序的寶石,例如gem 'sqlite3'gem 'pg'
  • 在配置/ application.rb中,與

     
    require "action_controller/railtie" 
    require "action_mailer/railtie" 
    require "sprockets/railtie" 
    require "rails/test_unit/railtie" 
    

  • 在配置/環境/ development.rb更換require 'rails/all',刪除或註釋掉config.active_record.migration_error = :page_load

  • 潛在的,你必須從spec_helper刪除active_record傭工(通過在評論毒液)

  • 潛在您必須刪除ConnectionManagement中間件(似乎與麒麟的情況下):config.app_middleware.delete "ActiveRecord::ConnectionAdapters::ConnectionManagement"(通過https://stackoverflow.com/a/18087332/764342

我希望這可以幫助別人尋找如何在Rails的ActiveRecord的禁用4.

+3

謝謝!仍然需要從spec_helper中刪除active_record幫助程序(不是必需的,但是如果您正在運行規範)。請參閱Rimian的最新評論。 – VenoM 2013-07-08 12:01:54

+0

幫助我,謝謝!根據以下注釋,可能會有其他配置聲明在application.rb和/或environments/{env} .rb文件中註釋掉。因人而異。 – 2013-07-26 19:56:28

+0

activerecord仍然保留在gemfile.lock中...我們可以對它做些什麼嗎? – Boti 2013-08-14 09:07:31