ลบ ActiveRecord ใน Rails 3


99

ตอนนี้ Rails 3 beta ใช้งานได้แล้วฉันคิดว่าจะได้ดูการเขียนแอปใหม่ที่เพิ่งเริ่มใช้งานใน Rails 3 beta ทั้งสองอย่างเพื่อให้รู้สึกถึงมันและเริ่มต้นได้เล็กน้อย แอพนี้ใช้ MongoDB และ MongoMapper สำหรับทุกรุ่นดังนั้นจึงไม่จำเป็นต้องใช้ ActiveRecord ในเวอร์ชันก่อนหน้าฉันกำลังยกเลิกการโหลด activerecord ด้วยวิธีต่อไปนี้:

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 ได้อย่างไร เหตุผลที่ฉันต้องทำเช่นนี้เพราะไม่เพียง แต่จะโง่ที่จะโหลดสิ่งที่ฉันไม่ต้องการเท่านั้น แต่ยังบ่นเกี่ยวกับการไม่สามารถเชื่อมต่อ DB ได้แม้ว่าฉันจะพยายามเรียกใช้เครื่องกำเนิดไฟฟ้าสำหรับคอนโทรลเลอร์ก็ตาม นี่เป็นเพราะฉันได้ล้างdatabase.ymlและแทนที่ด้วยรายละเอียดการเชื่อมต่อสำหรับ MongoDB เพื่อใช้ส่วนสำคัญนี้ในการใช้ database.yml สำหรับรายละเอียดการเชื่อมต่อ MongoDB ไม่แน่ใจว่าทำไมจึงต้องสามารถเริ่มต้นการเชื่อมต่อ DB เพื่อสร้างคอนโทรลเลอร์ได้ ...

มีใครทราบวิธีการทำ Rails 3 ที่ถูกต้องหรือไม่?

คำตอบ:


155

ฉันจะตามนี้จากการอ่านแหล่งที่มาดังนั้นโปรดแจ้งให้เราทราบว่ามันใช้งานได้จริงหรือไม่ :)

ขณะนี้railsคำสั่งที่สร้างเทมเพลตแอปพลิเคชันมีตัวเลือก-Oซึ่งบอกให้ข้าม ActiveRecord

หากคุณไม่ต้องการเรียกใช้งานrailsใหม่คุณควรตรวจสอบสิ่งต่อไปนี้ในแอปที่คุณมีอยู่:

  • ตรวจสอบว่าคุณconfig/application.rb ไม่ได้มีหรือrequire 'rails/all' require "active_record/railtie"สำหรับการตั้งค่า Rails มาตรฐานที่ไม่มี ActiveRecord ควรมีเพียงสิ่งต่อไปนี้ที่ต้องการ:

    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' ได้ ฉันรันคำสั่ง rail สำหรับแอปอื่น (ชั่วคราว) ด้วยตัวเลือกนี้และสร้างเทมเพลตแอปใหม่ที่ตรงกับสิ่งที่คุณเขียนไว้ข้างต้น ฉันจึงสามารถคัดลอกและวางการเปลี่ยนแปลงเหล่านี้ลงในแอปจริงของฉันได้ ขอบคุณ - พบดี :)
Mark Embling

1
ยอดเยี่ยม - ขอบคุณสำหรับ --skip-activerecord นั่นเป็นเพียงสิ่งที่ฉันต้องการ
Finglas

ส่วนใหญ่ใช้งานได้ยกเว้นเมื่อฉันรันรางสร้าง - ฉันยังคงเห็นสิ่งต่างๆของ ActiveRecord อยู่ที่นั่น - ฉันจะลบออกได้อย่างไร
Hackeron

8
ในราง 3.1 คุณต้องมีrequire "sprockets/railtie"ในapplication.rbไฟล์ของคุณด้วย
erskingardner

1
เพียงเพื่อเพิ่มการปรับปรุงอย่างรวดเร็วคำตอบนี้และแสดงความคิดเห็นก่อนหน้านี้ของฉัน ... ใน Rails 3.1 --skip-active-recordก็คือตอนนี้ สังเกตเส้นประพิเศษ
Mark Embling

46

ราง 4

ฉันกำลังมองหาวิธีปิดการใช้งานในราง 4 และพบเพียงคำตอบนี้ซึ่งใช้ไม่ได้ในราง 4 อีกต่อไปดังนั้นนี่คือวิธีที่คุณสามารถทำได้ในราง 4 (ทดสอบใน RC1)

ในโครงการใหม่

rails new YourProject --skip-active-record

ในโครงการที่มีอยู่

  • ใน Gemfile ของคุณเอาอัญมณีไดรเวอร์ฐานข้อมูลเช่นหรือgem 'sqlite3'gem 'pg'
  • ใน config / application.rb ให้แทนที่require 'rails/all'ด้วย

    ต้องการ "action_controller / railtie"
    ต้องการ "action_mailer / railtie"
    ต้องใช้ "sprockets / railtie"
    ต้องใช้ "rail / test_unit / railtie"
    

  • ใน config / environment / development.rb ให้ลบหรือคอมเมนต์ออก config.active_record.migration_error = :page_load

  • เป็นไปได้ว่าคุณต้องลบตัวช่วย active_record ออกจาก spec_helper (ผ่าน VenoM ในความคิดเห็น)

  • เป็นไปได้ว่าคุณต้องลบมิดเดิลแวร์ ConnectionManagement (ดูเหมือนจะเป็นกรณีที่มียูนิคอร์น): config.app_middleware.delete "ActiveRecord::ConnectionAdapters::ConnectionManagement"(ผ่านhttps://stackoverflow.com/a/18087332/764342 )

ฉันหวังว่านี่จะช่วยให้ผู้อื่นกำลังมองหาวิธีปิดใช้งาน ActiveRecord ใน Rails 4


3
ขอบคุณ! คุณยังต้องลบตัวช่วย active_record ออกจาก spec_helper (ไม่บังคับ แต่ถ้าคุณกำลังเรียกใช้ข้อมูลจำเพาะ) ดูความคิดเห็นล่าสุดโดย Rimian
VenoM

ช่วยฉันด้วยขอบคุณ! ตามความคิดเห็นด้านล่างอาจมีการประกาศการกำหนดค่าอื่น ๆ เพื่อแสดงความคิดเห็นในไฟล์ application.rb และ / หรือ environment / {env} .rb YMMV.
Nathan Smith

activerecord ยังคงอยู่ใน gemfile.lock ... เราจะทำอะไรกับมันได้ไหม?
Boti

@ บอดีไม่น่า. มันเป็นส่วนหนึ่งของราง ในการลบออกจาก. lock ของคุณฉันคิดว่าคุณต้องลบการพึ่งพารางและขึ้นอยู่กับส่วนประกอบแต่ละอย่าง ตรวจสอบ gemspec สำหรับรายการการอ้างอิง - คุณต้องการขึ้นอยู่กับทุกสิ่งยกเว้น activerecord github.com/rails/rails/blob/master/rails.gemspec
John Hinnegan

ดูเหมือนว่าฉันจะพบปัญหาที่เกี่ยวข้องกับ i18n หลังจากทำการเปลี่ยนแปลงนี้: lib / active_support / i18n.rb: 13: ใน `<top (required)> ': uninitialized constant I18n (NameError) ความคิดใด ๆ ?
Michael Pell

36

สำหรับแอปพลิเคชันรางใหม่คุณสามารถยกเว้นบันทึกที่ใช้งานได้โดยระบุพารามิเตอร์ --skip-active-record เช่น:

rails new appname --skip-active-record

ฉันทำสิ่งนี้และใช้ความแตกต่างเล็กน้อยเพื่อค้นหาและลบสิ่งต่างๆในแอปปัจจุบันของฉันที่ใช้ ActiveRecord
Keith Smiley

15

หากคุณสร้างโปรเจ็กต์ใหม่โดยใช้ Rails 3.2 คุณจะต้องแสดงความคิดเห็น:

config.active_record.mass_assignment_sanitizer = :strict

และ

config.active_record.auto_explain_threshold_in_seconds = 0.5

ในไฟล์development.rbของคุณ


6

ที่กล่าวมาทั้งหมดเป็นความจริง อีกสิ่งหนึ่งที่ฉันต้องทำในราง 3.1 คือการแสดงความคิดเห็น

config.active_record.identity_map = true

ในconfig/application.rb.


2

หากคุณใช้ rspec คุณจะต้องลบ (ใน spec_helper) ด้วย:

  # 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

1

นอกจากนี้ยังแสดงความคิดเห็นออกมา

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

(ระบุไว้ในราง 3.2.13)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.