Ruby on Rails:默认情况下阻止选择列

krn*_*krn 6 activerecord ruby-on-rails

我有一个entriescontent可能包含大量文本的字段.在大多数情况下,我不需要访问该字段,因此每次从数据库加载大量未使用的数据(从*= 1的条目中选择*)似乎是浪费大量资源.

我怎样才能指定default_scope,除了content从数据库加载的所有字段?

phl*_*per 13

假设Rails 3和一个如下所示的模式:

create_table "entries", :force => true do |t|
  t.string   "title"
  t.text     "content"
  t.datetime "created_at"
  t.datetime "updated_at"
end
Run Code Online (Sandbox Code Playgroud)

您可以使用该select方法来限制返回的字段,如下所示:

class Entry < ActiveRecord::Base
  default_scope select([:id, :title])
end
Run Code Online (Sandbox Code Playgroud)

在rails控制台中,您应该看到如下内容:

puts Entry.where(:id => 1).to_sql  # => SELECT id, title FROM "entries"  WHERE "entries"."id" = 1
Run Code Online (Sandbox Code Playgroud)

当您想要选择所有字段时,可以使用如下unscoped方法:

puts Entry.unscoped.where(:id => 1).to_sql  # => SELECT * FROM "entries"  WHERE "entries"."id" = 1
Run Code Online (Sandbox Code Playgroud)