Rails 3.1 не будет ленивой загрузки при попытке сделать что-то вроде этого: user.posts.class #=>Массив

#ruby-on-rails #ruby #lazy-loading

#ruby-on-rails #ruby #отложенная загрузка

Вопрос:

 class User < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
  belongs_to :user
end
  

В irb:

 > u = User.first
 => #<xxxxx>
> u.posts.class
 => Array
  

Мой env:

 $ruby -v
ruby 1.9.2p312 
$rails --version
--version
Rails 3.1.0
  

Я помню, что почти все запросы к отношениям возвращают ActiveRecord::Relation в rails3;

Что не так?

ps: Мне нужно получить «класс» из объекта ActiveRecord ::Relation;

Ответ №1:

davidb прав в отношении has_many , но я предполагаю, что вы хотите получить класс, не обращаясь к базе данных. Используйте это:

 User.first.posts.proxy_reflection.klass
  

(Отказ от ответственности: использует внутренние методы ActiveRecord и, вероятно, не будет работать, если Post использует STI)

Ответ №2:

Вы получаете связанный объект в отношении 1 ..1 или в отношении 1 .. n со стороны объекта, с которым belongs_to другой, но не со стороны, которая может иметь более одного связанного объекта. В этом случае это не имеет значения, если есть ноль, один, два, … 100 связанных объектов, потому что поведение не должно отличаться в зависимости от количества связанных объектов.

Так что замечание неверно с вашей ассоциацией.

 u.posts.first.class #will return the associated class
  

Ответ №3:

Методы Find, first, all и last active record будут запрашивать базу данных напрямую, а не возвращать объект ActiveRecord::Relation . Вы должны попробовать следующее,

 > klass = User.where("id=1").class
=> ActiveRecord::Relation
  

Обратите внимание, что консоль использует метод проверки для интерактивного отображения выходных данных.
Ссылка: http://edgeguides.rubyonrails.org/active_record_querying.html