Loại bỏ ActiveRecord trong Rails 3


99

Bây giờ Rails 3 beta đã ra mắt, tôi nghĩ mình sẽ xem xét việc viết lại một ứng dụng mà tôi mới bắt đầu làm việc trong phiên bản beta Rails 3, cả hai đều để cảm nhận nó và bắt đầu một chút. Ứng dụng sử dụng MongoDB và MongoMapper cho tất cả các mô hình của nó và do đó không cần ActiveRecord. Trong phiên bản trước, tôi đang dỡ bỏ activerecord theo cách sau:

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

Trong phiên bản mới nhất, điều này không hoạt động - nó chỉ gây ra lỗi:

/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*

Tất nhiên, tôi đã xem xét boot.rb như nó đề xuất, nhưng theo như tôi thấy, không có manh mối nào ở đây về cách tôi có thể tiến hành dỡ AR. Lý do tôi cần làm điều này là bởi vì không chỉ thật ngớ ngẩn khi tải thứ gì đó tôi không muốn mà còn phàn nàn về việc không thể tạo kết nối DB ngay cả khi tôi cố gắng chạy bộ tạo cho bộ điều khiển. Điều này là do tôi đã xóa database.ymlvà thay thế nó bằng chi tiết kết nối cho MongoDB để sử dụng ý chính này để sử dụng database.yml cho chi tiết kết nối MongoDB. Không chắc tại sao nó lại cần có khả năng khởi tạo kết nối DB chỉ để tạo bộ điều khiển ....

Có ai biết về cách Rails 3 chính xác để làm điều này không?

Câu trả lời:


155

Tôi sẽ làm điều này từ việc đọc nguồn, vì vậy hãy cho tôi biết nếu nó thực sự hoạt động. :)

Các railslệnh mà tạo ra các mẫu ứng dụng bây giờ có một tùy chọn -O, mà nói với nó để bỏ qua ActiveRecord.

Nếu không muốn chạy lại rails, bạn nên kiểm tra những điều sau trong ứng dụng hiện có của mình:

  • Kiểm tra xem của bạn config/application.rb khôngrequire 'rails/all'hoặc require "active_record/railtie". Thay vào đó, cho một tiêu chuẩn Rails thiết lập mà không cần ActiveRecord, cần có chỉ sau đây yêu cầu:

    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
  • Nếu, trong config/application.rb, bạn đang sử dụng config.generatorsphần này, hãy đảm bảo phần đó không có dòng g.orm :active_record. Bạn có thể đặt điều này rõ ràng thành nil, nếu bạn muốn, nhưng điều này phải là mặc định khi g.ormhoàn toàn bị bỏ qua.

  • Tùy chọn, nhưng trong của bạn Gemfile, hãy xóa gemdòng tải mô-đun cho cơ sở dữ liệu của bạn. Đây có thể là dòng gem "mysql"chẳng hạn.


3
Yup, điều đó dường như đã làm được. Có vẻ như tùy chọn -O cũng có thể được gọi là '--skip-activerecord'. Tôi đã chạy lệnh rails cho một ứng dụng (tạm thời) khác với tùy chọn này và nó tạo ra một mẫu ứng dụng mới khớp chính xác với những gì bạn đã viết ở trên. Vì vậy, tôi chỉ có thể sao chép và dán những thay đổi này vào ứng dụng thực tế của mình. Cảm ơn - rất vui :)
Mark Embling

1
Tuyệt vời - cảm ơn vì --skip-activerecord. Đó chỉ là những gì tôi cần.
Finglas

Điều đó hầu hết hoạt động, ngoại trừ khi tôi chạy rails tạo - tôi vẫn thấy nội dung ActiveRecord ở đó - làm cách nào để xóa nó?
Hackeron

8
Trong rails 3.1, bạn cũng cần có require "sprockets/railtie"trong application.rbtệp của mình .
erskingardner

1
Chỉ để thêm cập nhật nhanh cho câu trả lời này và nhận xét trước đây của tôi ... trong Rails 3.1, bây giờ là như vậy --skip-active-record. Chú ý dấu gạch ngang phụ.
Đánh dấu Embling

46

Đường ray 4

Tôi đã tìm cách vô hiệu hóa nó trong rails 4 và chỉ tìm thấy câu trả lời này không còn hoạt động trong rails 4. Vì vậy, đây là cách bạn có thể thực hiện trong rails 4 (đã thử nghiệm trong RC1).

Trong một dự án mới

rails new YourProject --skip-active-record

Trong một dự án hiện có

  • Trong Gemfile của bạn, hãy xóa gem trình điều khiển cơ sở dữ liệu, ví dụ: gem 'sqlite3'hoặc gem 'pg'.
  • Trong config / application.rb, thay thế require 'rails/all'bằng

    yêu cầu "action_controller / railtie"
    yêu cầu "action_mailer / railtie"
    yêu cầu "xích / thanh ray"
    yêu cầu "rails / test_unit / railtie"
    

  • Trong config / environment / development.rb, xóa hoặc nhận xét config.active_record.migration_error = :page_load

  • Có thể bạn phải xóa trình trợ giúp active_record khỏi spec_helper (thông qua VenoM trong nhận xét)

  • Có khả năng bạn phải xóa phần mềm trung gian ConnectionManagement (có vẻ như trường hợp với unicorn): config.app_middleware.delete "ActiveRecord::ConnectionAdapters::ConnectionManagement"(qua https://stackoverflow.com/a/18087332/764342 )

Tôi hy vọng điều này sẽ giúp những người khác đang tìm cách vô hiệu hóa ActiveRecord trong Rails 4.


3
Cảm ơn! Tuy nhiên, bạn vẫn cần xóa trình trợ giúp active_record khỏi spec_helper (Không bắt buộc, nhưng nếu bạn đang chạy thông số kỹ thuật). Xem bình luận cuối cùng của Rimian.
VenoM

Đã giúp tôi, cảm ơn! Theo nhận xét bên dưới, có thể có các khai báo cấu hình khác để nhận xét trong tệp application.rb và / hoặc môi trường / {env} .rb. YMMV.
Nathan Smith,

Activerecord vẫn còn trong gemfile.lock ... Chúng ta có thể làm gì đó chống lại nó không?
Boti

@Boti Không có khả năng. Nó là một phần của đường ray. Để xóa nó khỏi .lock của bạn, tôi tưởng tượng bạn phải xóa sự phụ thuộc vào đường ray và phụ thuộc vào tất cả các thành phần riêng lẻ. Kiểm tra gemspec để biết danh sách các phụ thuộc - bạn muốn phụ thuộc vào mọi thứ trừ activerecord. github.com/rails/rails/blob/master/rails.gemspec
John Hinnegan

Có vẻ như tôi đang gặp phải sự cố liên quan đến i18n sau khi thực hiện thay đổi này: lib / active_support / i18n.rb: 13: in `<top (bắt buộc)> ': hằng số chưa khởi tạo I18n (NameError). Bất kỳ ý tưởng?
Michael Pell

36

Đối với một ứng dụng rails mới, bạn có thể đặt nó loại trừ bản ghi đang hoạt động bằng cách chỉ định tham số --skip-active-record. Ví dụ:

rails new appname --skip-active-record

Tôi đã làm điều này và chạy một vài diffs để tìm và loại bỏ các nội dung trong ứng dụng hiện tại của tôi đã được sử dụng ActiveRecord
Keith Smiley

15

Nếu bạn đã tạo một dự án mới bằng cách sử dụng Rails 3.2, bạn cũng sẽ cần phải nhận xét:

config.active_record.mass_assignment_sanitizer = :strict

config.active_record.auto_explain_threshold_in_seconds = 0.5

trong tệp development.rb của bạn .


6

Những điều ở trên đều đúng. Một điều nữa mà tôi phải làm trong rails 3.1 là bình luận

config.active_record.identity_map = true

trong config/application.rb.


2

Nếu bạn đang chạy rspec, bạn cũng cần xóa (trong spec_helper):

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

và loại bỏ

  # 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

1

Cũng bình luận ra

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

(ghi chú trên đường ray 3.2.13)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.