Rails 3.1 не будет лениво загружаться при попытке что-то вроде этого: user.posts.class # => Array - PullRequest
1 голос
/ 29 октября 2011
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;

Ответы [ 3 ]

0 голосов
/ 29 октября 2011

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

User.first.posts.proxy_reflection.klass

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

0 голосов
/ 29 октября 2011

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

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

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

0 голосов
/ 29 октября 2011

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

Значит, замечать, что с тобой не так.

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