rails new left includes array active ruby-on-rails ruby-on-rails-3 activerecord eager-loading

ruby on rails - new - Rieles 3 Limitar objetos incluidos



rails where in array (2)

Debes limitar la cantidad de publicaciones en tu modelo de blog de esta manera:

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

Entonces puedes hacer:

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

Por ejemplo, tengo un objeto de blog, y ese blog tiene muchas publicaciones. Quiero hacer una carga impaciente de decir el primer objeto de blog e incluir decir las primeras 10 publicaciones del mismo. Actualmente haría @blogs = Blog.limit(4) y luego en la vista use @blogs.posts.limit(10) . Estoy bastante seguro de que hay una mejor manera de hacerlo a través de una inclusión como Blog.include(:posts).limit(:posts=>10) . ¿No es posible limitar el número de objetos incluidos o me falta algo básico aquí?


Parece que no puede aplicar un límite a :has_many cuando está ansioso de cargar asociaciones para varios registros.

Ejemplo:

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

Esto funciona bien para limitar el número de publicaciones para un solo blog:

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

Sin embargo, si intenta cargar todos los blogs y desea cargar las publicaciones con ellos:

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)

Tenga en cuenta que no hay límite en la segunda consulta, y no podría haberlo; limitaría la cantidad de publicaciones devueltas a 5 en todos los blogs, lo que no es en absoluto lo que desea.

EDITAR:

Una mirada a los documentos de Rails confirma esto. Siempre encuentras estas cosas en el momento en que las has descubierto :)

Si desea cargar una asociación con una opción especificada: límite, se ignorará y se devolverán todos los objetos asociados.