จะกำหนดค่า Ruby on Rails โดยไม่มีฐานข้อมูลได้อย่างไร?


102

จะเป็นการสะดวกที่จะใช้ Ruby on Rails สำหรับโครงการเว็บไซต์ขนาดเล็กที่ไม่จำเป็นต้องมีฐานข้อมูลในปัจจุบัน ฉันรู้ว่าฉันสามารถสร้างฐานข้อมูลเปล่าใน MySQL และไปจากที่นั่นได้ แต่มีใครรู้วิธีที่ดีกว่าในการเรียกใช้ Rails โดยไม่มีฐานข้อมูลหรือไม่?

ขอบคุณ

คำตอบ:


55

ยกเลิกการใส่ข้อคิดเห็นบรรทัดนี้ในenvironment.rbไฟล์:

config.frameworks -= [ :active_record, :active_resource, :action_mailer]

2
ในราง 3 เพียงแค่ถอดอัญมณี mysql ออกจาก Gemfile
jspooner

31
คุณจะทำสิ่งเดียวกันใน Rails 4 ได้อย่างไร?
Daniel Ristic

2
คำถามสำหรับ Rails 4 stackoverflow.com/questions/19078044/…
grumpasaurus

109

สำหรับRails 3และRails 4 :

ใช้-O(Capital 'O') หรือ--skip-activerecordตัวเลือกเพื่อสร้างแอปพลิเคชันโดยไม่มีฐานข้อมูล

rails new myApp -O

หรือ

rails new myApp --skip-activerecord

คำตอบนี้ถูกแชร์ต่อจากที่นี่


สำหรับRails 5 :

ใช้--skip-active-recordตัวเลือกเพื่อสร้างแอปพลิเคชันโดยไม่มีฐานข้อมูล

ขอให้สังเกตยัติภังค์พิเศษ '-' เมื่อเทียบกับรุ่นก่อนหน้านี้ทางรถไฟ

rails new myApp --skip-active-record


2
ใช่ใช้งานได้กับ Rails 4 :) - ตรวจสอบแล้ว หากคุณต้องการทิ้งการใช้งานหน่วยทดสอบ: ราง myApp-O ใหม่ --skip-bundle -T
Chris Hough

1
นี่เป็นวิธีที่ง่ายที่สุดหากคุณเริ่มต้นจากศูนย์แม้ว่าจะได้รับคำเตือนว่า (อย่างน้อยใน Rails 4.0.1) จะมี "-" ระหว่าง active และ record ในคำสั่งนั้น ดังนั้นควรอ่าน: ราง myApp ใหม่ --skip-active-record
Nic Benders

1
ฉันเพิ่งประสบปัญหาและสังเกตเห็น สำหรับ Rails 4.2.x ใช้-Oงานได้เท่านั้น ตัวเลือก--skip-activerecordไม่ทำงาน
Nazar Hussain

สิ่งนี้ใช้งานได้ใน rail-api เช่นกัน: ราง myApp -O ใหม่ ขอบคุณ
Abel

2
ในกรณีที่ใครสงสัยใน Rails 5 คือ--skip-active-record(สังเกตเส้นประระหว่าง active nad record) วิธีอื่นไม่ได้ผลสำหรับฉัน
audiodude

53

สำหรับโปรเจ็กต์ Rails 4/5/6 ที่มีอยู่ในconfig/application.rbไฟล์ของคุณคุณมีบรรทัดต่อไปนี้:

require 'rails/all' # or `require "rails"' in newer versions

(อ้างอิงว่าบรรทัดกำลังโหลดไฟล์นี้ )
ดังนั้นแทนที่จะโหลด ALL คุณต้องโหลดแต่ละไลบรารีแยกกันดังนี้:

# active_record is what we're not going to use it, so comment it "just in case"
# require "active_record/railtie" 

# This is not loaded in rails/all but inside active_record so add it if
# you want your models work as expected
require "active_model/railtie" 
# And now the rest
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "active_job/railtie" # Only for Rails >= 4.2
require "action_cable/engine" # Only for Rails >= 5.0
require "sprockets/railtie"
require "rails/test_unit/railtie"

# All these depend on active_record, so they should be excluded also
# require "action_text/engine" # Only for Rails >= 6.0
# require "action_mailbox/engine" # Only for Rails >= 6.0
# require "active_storage/engine" # Only for Rails >= 5.2

จับตาดูความคิดเห็นเพื่อทราบว่าต้องโหลดอะไรบ้างเกี่ยวกับเวอร์ชัน Rails ของคุณ
ตรวจสอบไฟล์ต่อไปนี้ด้วย (ในกรณีที่คุณมี) และแสดงความคิดเห็นในบรรทัดต่อไปนี้:

# package.json
"@rails/activestorage": "^6.0.0",

# app/javascript/packs/application.js
require("@rails/activestorage").start()

# bin/setup
system! 'bin/rails db:prepare'

# config/environments/development.rb
config.active_storage.service = :local # For Rails >= 5.2
config.active_record.migration_error = :page_load
config.active_record.verbose_query_logs = true

# config/environments/test.rb
config.active_storage.service = :test # For Rails >= 5.2

# config/environments/production.rb
config.active_storage.service = :local # For Rails >= 5.2
config.active_record.dump_schema_after_migration = false

# spec/rails_helper.rb
ActiveRecord::Migration.maintain_test_schema!

# test/test_helper.rb
fixtures :all # In case you're using fixtures

# Only for Rails >= 5.0
#config/initializers/new_framework_defaults.rb
Rails.application.config.active_record.belongs_to_required_by_default = true

ลบการอ้างอิงใด ๆActiveRecord::Baseในไฟล์โมเดลของคุณด้วย (หรือเพียงแค่ลบไฟล์ถ้ามี) ตัวอย่างเช่นapp/models/application_record.rbไฟล์ที่สร้างขึ้นโดยอัตโนมัติ


2
สำหรับ Rails 5 คุณอาจต้องการactive_job/railtieและaction_cable/engine
Ingmaras Keleras

2
ไม่มีอะแดปเตอร์ดัมมี่ DB ที่จะใช้database.ymlดังนั้นมันจะเพิกเฉยต่อ DB หรือไม่?
Chloe

Rails 5 นำไปสู่ปัญหาการล้มเหลวrake assets:precompileเนื่องจากNoMethodError: undefined method active_record'`: /
flp

3
@Chloe activerecord-nulldb-adapterจากgithub.com/nulldb/nulldbช่วยให้คุณสามารถเปลี่ยนอะแดปเตอร์สำหรับการเปลี่ยนแปลงชั่วคราวหรือรุกรานน้อยลง
Unixmonkey

1
@cdmo เดี๋ยวก่อนขอบคุณที่สังเกตเห็น ฉันได้อัปเดตคำตอบเพื่อให้สามารถใช้งานร่วมกับราง 6 ได้อย่างสมบูรณ์ไม่แน่ใจเกี่ยวกับสิ่งที่คุณแสดงความคิดเห็นในคำตอบของคุณเนื่องจากฉันสร้างแอพ 2 รางทั้งที่มีและไม่มี-Oและaction_mailerไม่เกี่ยวข้องด้วยconfig/detabase.ymlดังนั้นจึงไม่จำเป็นต้องแสดงความคิดเห็น นอกจากนี้ยังมีบรรทัดพิเศษเพื่อแสดงความคิดเห็นหลังจากactive_storageแสดงความคิดเห็น
Alter Lagos

16

ใน Rails 4 เมื่อเริ่มโปรเจ็กต์ใหม่คุณสามารถใช้ -O หรือ --skip-active-record

rails new my_project -O
rails new my_project --skip-active-record

หากคุณสร้างโครงการแล้วคุณจะต้องแสดงความคิดเห็น

 require "active_record/railtie"

จาก config / application.rb และ

 config.active_record.migration_error = :page_load

จาก config / environment / development.rb


14

หากคุณไม่ต้องการฐานข้อมูลคุณอาจไม่จำเป็นต้องมี Rails จำนวนมาก คุณอาจต้องการเฟรมเวิร์กที่ปรับแต่งได้น้อยลงเพื่อใช้งานได้

Sinatraเป็นเฟรมเวิร์กเล็ก ๆ ที่เหมาะอย่างยิ่งสำหรับการแสดงเพจคงพื้นฐาน

แต่ถ้าคุณยืนยันในการใช้ทางรถไฟที่นี่เป็นบทความที่จะแสดงให้คุณเห็นวิธีการทำแค่นั้นหรือนี่


ขอบคุณ - ลิงก์ทั้งสองนี้อ้างถึงหนังสือ Rails Recipes และมีขั้นตอนในการทดสอบการทำงานกับแอปพลิเคชันรางที่ไม่ใช้ฐานข้อมูล ฉันขี้เกียจและหวังว่าจะใช้ประโยชน์จากโครงสร้างพื้นฐานของรางที่มีอยู่แล้วบนเซิร์ฟเวอร์สำหรับแอปอื่น ๆ แต่ซินตราดูน่าสนใจ
RobbieCanuck

1
ฉันไม่เห็นด้วย. Active.com สร้างขึ้นบน Rails โดยไม่มีฐานข้อมูลเนื่องจากข้อมูลทั้งหมดมาจาก api
jspooner

หมายเหตุ: ลิงก์ที่สองในประโยคสุดท้ายไม่มีแล้ว ฉันได้รับข้อผิดพลาด 404 ไม่พบ
Pamela Cook - LightBe Corp

0

สำหรับรองรับ Rails 6 rc1 และ activerecord-nulldb-adapterอัญมณีเราจำเป็นต้องมีการปะลิง

ในconfig / initializers / null_db_adapter_monkey_patches.rb

module ActiveRecord
  module ConnectionAdapters
    class NullDBAdapter < ActiveRecord::ConnectionAdapters::AbstractAdapter
      def new_table_definition(table_name = nil, is_temporary = nil)
        TableDefinition.new(table_name, is_temporary)
      end
    end
  end
end
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.