add_index :members, :email。:null => false。varchar(255) 過大,依業務限制縮減(如 :limit => 10)。預設關聯載入懶惰。範例:Member.find([1,2,3]).each { |m| puts m.address.city } 產生 1+3=4 條 SQL。
加入 :include => :address:
Member.find([1,2,3], :include => :address).each { |m| puts m.address.city }
單條 SQL 完成 LEFT OUTER JOIN,效能大幅提升。支援一層巢狀 :include => { :contacts => :address }。
單表繼承 (STI) 導致寬表、空值多、不適用於差異大的子類型 (如 Cause、Gift、Nonprofit)。
改用多態關聯:
class Cause < ActiveRecord::Base has_one :content_base, :as => :displayable, :dependent => :destroy end class ContentBase < ActiveRecord::Base belongs_to :displayable, :polymorphic => true end
Migration:t.string :displayable_type; t.integer :displayable_id。優點:共用邏輯集中於 ContentBase,各子類型表結構獨立,避免寬表問題。缺點:無資料庫層級外鍵約束,工具難自動識別關聯。
需跨多表、複雜聚合時,直接使用 ActiveRecord::Base.connection.execute("SELECT ...") 或資料庫 View,避免 ActiveRecord 物件建立開銷。
:include Eager Loading — 消除 N+1。ActiveRecord 功能強大,但必須理解其生成的 SQL,適時調整策略,才能構建可擴展、高效能的 Rails 系統。