#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