Pregunta

Nota:. Estoy utilizando rieles 2.3.8, no 3

Tengo un modelo de la foto con un default_scope:

default_scope :conditions => ["published = ?", true], :order => :position

Calling photo_album.photos devuelve toda publicadas fotos ordenado por posición como debería. Sin embargo, cuando un bucle a través de estos álbumes de fotos en un panel de administración para mostrar el número de fotos en cada uno, los resultados son malos:

pluralize(photo_album.photos.count, "photo")

devuelve 0, ya que ninguno se publican.

Sé que preguntas similares se les ha pedido, y la respuesta es típicamente a lo largo de las líneas de "usar un método de clase with_exclusive_scope". Por lo que yo puedo decir, esto evita completamente el uso de asociaciones Rieles estándar - básicamente lo que resulta en algo como esto:

pluralize(Photo.all_photos_in_album(photo_album.id).count, "photo")

y que requiere un método de clase como:

def Photo.all_photos_in_album(album_id)
  self.with_exclusive_scope { find(:all, :conditions => ["photo_album_id = ?", album_id]) }
end

sólo para mostrar el número total de fotografías en un álbum. Esto parece una locura - anulando el valor por defecto no debería requerir el abandono de los carriles convenios de asociación. with_exclusive_scope no se puede utilizar en un método de instancia (método protegido) o bien - esto habría permitido que cree un método de instancia PhotoAlbum llamado "all_photos" a por lo menos preservar la apariencia de asociaciones (photo_album.all_photos). Pero no, eso no está permitido: (

Además de la eliminación de default_scopes, que han demostrado ser muy útil en todo el sitio, ¿alguien sabe de una manera ámbitos predeterminados de anulación y mantener los carriles sintaxis asociación?

Gracias!

Editar

terminé la adición de un método de instancia ÁlbumDigital que, si bien no es una anulación default_scope real, hace al maquillaje para la sintaxis más agradable tanto en mis puntos de vista:

def all_photos_count
  PhotoAlbum.count_by_sql("SELECT COUNT(id) FROM photos WHERE photo_album_id = #{self.id} ORDER BY created_at")
end

pluralize(photo_album.all_photos_count, "photo")

Aunque no es exactamente una asociación AR has_many y que se basa en SQL puro, que es el mejor compromiso que he encontrado hasta el momento.

¿Fue útil?

Solución 2

Para mí, la mejor solución en este caso era utilizar ni default_scope ni condiciones has_many y sólo palo con named_scopes. Dos named_scopes a cabo la mayor parte de lo que necesitaba para mantener mi punto de vista magra:

named_scope :public_list, :conditions => ["published = ?", true], :order => :position
named_scope :private_list, :order => "created_at DESC"

Otros consejos

No entiendo por qué no lo haces en Álbum:

has_many :photos
has_many :published_photos, :class_name => 'Photo', :conditions => ["published = ?", true], :order => :position

De esta manera se podría hacer:

@album.photos.count
@album.published_photos

Y así sucesivamente ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top