Например, у меня есть объект блога, и у этого блога много сообщений. Я хочу, чтобы я хотел сказать, что первый блог-объект включен, и включите в него первые 10 сообщений. В настоящее время я бы сделал @blogs = Blog.limit(4)
, а затем в представлении используйте @blogs.posts.limit(10)
. Я уверен, что есть лучший способ сделать это с помощью include, такого как Blog.include(:posts).limit(:posts=>10)
. Невозможно ли ограничить количество включенных объектов, или я пропустил что-то основное здесь?
Рельсы 3 Ограничение объектов
Ответ 1
Похоже, вы не можете применить предел к :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 во всех блогах, что совсем не то, что вы хотите.
EDIT:
Взгляд на Rails docs подтверждает это. Вы всегда находите эти вещи в ту минуту, когда вы их выяснили:)
Если вы хотите загрузить связь с указанным параметром limit, будет проигнорирован, возвращая все связанные объекты
Ответ 2
Вам нужно ограничить количество сообщений в вашей модели блога следующим образом:
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