¿Cuál es un enfoque común para los registros de alcance por aquellos que un usuario puede "leer"?

Estoy usando Ruby on Rails 3.2.2 y me gustaría saber cuál es un enfoque común cuando se debe verificar si un usuario tiene las autorizaciones adecuadas para "leer" los registros presentes en una "lista" de registros. Es decir, en este momento tengo lo siguiente:

class Article < ActiveRecord::Base
  def readable_by_user?(user)
    # Implementation of multiple authorization checks that are not easy to
    # translate into an SQL query (at database level, it executes a bunch of
    # "separate" / "different" SQL queries).

    ... # return 'true' or 'false'
  end
end

Al utilizar el código anterior, puedo realizar verificaciones de autorización en unsoltero objeto del artículo:

@article.readable_by_user?(@current_user)

Sin embargo, cuando me gustaría hacer (por lo general, en mi controladorindex acción) algo como lo siguiente recuperando exactamente 10 objetos

Article.readable_by_user(@current_user).search(...).paginate(..., :per_page => 10)

Aún debo realizar comprobaciones de autorización en cada objeto. Asi que,Qué puedo hacer para realizar las verificaciones de autorización en esa "lista" de registros (una serie deArticle objetos)¿De una manera "inteligente" / "performante"? Eso es, por ejemplo, debería cargarArticle.all (tal vez ordenándolos por datos creados, limitando la consulta SQL a 10 registros, ...) y luego iterar en cada uno de esos objetos para realizar verificaciones de autorización. ¿O debería hacer algo diferente (tal vez con algún truco de consulta SQL, alguna instalación de Ruby on Rails o algo más)?

ACTUALIZADO tras la respuesta de @Matzi.

Traté de recuperar artículoslegible por un usuario "manualmente", por ejemplo utilizando elfind_each método:

# Note: This method is intended to be used as a "scope" method
#
#   Article.readable_by_user(@current_user).search(...).paginate(..., :per_page => 10)
#
def self.readable_by_user(user, n = 10)
  readable_article_ids = []

  Article.find_each(:batch_size => 1000) do |article|
    readable_article_ids << article.id if article.readable_by_user?(user)

    # Breaks the block when 10 articles have passed the readable authorization 
    # check.
    break if readable_article_ids.size == n
  end

  where("articles.id IN (?)", readable_article_ids)
end

En este momento, el código anterior es el "compromiso más importante" en el que puedo pensar, incluso si tiene algún escollo: es "restringe"la cantidad de objetos recuperados a una cantidad dada de registros con un dadoids (10 registros por defecto en el ejemplo anterior); hablando practicamente,"realmente" no recupera todos los objetos legibles por un usuario ya que cuando se intenta ampliar el alcance de los relacionadosActiveRecord::Relation "donde" / "con que" elreadable_by_user se utiliza el método de alcance (por ejemplo, cuando también buscaría artículos portitle añadiendo una cláusula de consulta SQL adicional), seríarestringir registros a esoswhere("articles.id IN (?)", readable_article_ids) (es decir, "limita" / "restringe" la cantidad de objetos recuperados y legibles a los primeros 10 artículos y todos los demás artículoslegible por el usuario será ignorado al buscar portitle). Una solución al problema para hacer que elreadable_by_user método para trabajar adecuadamente con más métodos de alcance podría ser hacerno break el bloque para cargar todolegible artículos, pero no es bueno por razones de rendimiento cuando hay muchos registros (tal vez, otra solución podría ser almacenar en algún lugar todo el artículoidEs legible para un usuario, pero creo que no es una solución común / fácil para resolver el problema).

Asi que,¿Hay alguna manera de lograr lo que me gustaría hacer de una manera correcta y "realmente" correcta (tal vez, cambiando el enfoque anterior)?

Respuestas a la pregunta(5)

Su respuesta a la pregunta