Rails 3 Ограничение включенных объектов - PullRequest
16 голосов
/ 16 июля 2011

Например, у меня есть объект блога, и в этом блоге много постов.Я хочу сделать загрузку, скажем, первый объект блога и включить, скажем, первые 10 сообщений этого.В настоящее время я бы сделал @blogs = Blog.limit(4), а затем в представлении использовать @blogs.posts.limit(10).Я уверен, что есть лучший способ сделать это с помощью включения, такого как Blog.include(:posts).limit(:posts=>10).Разве нельзя ограничить количество включаемых объектов или я что-то здесь упускаю?

Ответы [ 2 ]

10 голосов
/ 17 июля 2011

Похоже, вы не можете применить ограничение к :has_many, когда хотите загружать ассоциации для нескольких записей.

Пример:

class Blog < ActiveRecord::Base
  has_many :posts, :limit => 5
end

class Post < ActiveRecord::Base
  belongs_to :blog
end

Это прекрасно работает для ограничения количества сообщений для одного блога:

ruby-1.9.2-p290 :010 > Blog.first.posts
  Blog Load (0.5ms)  SELECT `blogs`.* FROM `blogs` LIMIT 1
  Post Load (0.6ms)  SELECT `posts`.* FROM `posts` WHERE `posts`.`blog_id` = 1 LIMIT 5

Однако, если вы попытаетесь загрузить все блоги инетерпеливо загружайте посты с ними:

ruby-1.9.2-p290 :011 > Blog.includes(:posts)
  Blog Load (0.5ms)  SELECT `blogs`.* FROM `blogs` 
  Post Load (1.1ms)  SELECT `posts`.* FROM `posts` WHERE `posts`.`blog_id` IN (1, 2)

Обратите внимание, что для второго запроса нет ограничений, и не может быть - это ограничило бы количество сообщений, возвращаемых 5, во всех блогах, что нена все, что вы хотите.

РЕДАКТИРОВАТЬ:

Взгляд на Rails документы подтверждает это.Вы всегда найдете эти вещи в ту минуту, когда вы их выяснили:)

Если вы хотите загрузить ассоциацию с указанным параметром: limit, она будет проигнорирована, возвращая все связанные объекты

2 голосов
/ 17 июля 2011

Вам нужно ограничить количество постов в вашей модели блога следующим образом:

class Blog < ActiveRecord::Base
    has_many :included_posts, :class_name => 'Post', :limit => 10
    has_many :posts
end

Итак, вы можете сделать:

$ Blog.first.included_posts.count
=> 10
$ Blog.first.posts.count 
=> 999
...