Selección elegante de atributos de has_many: a través de modelos de unión en Rails

Me pregunto cuál es la forma más fácil / elegante de seleccionar atributos de modelos de combinación en has_many: a través de asociaciones.

Digamos que tenemos artículos, catálogos y artículos de catálogo con la siguiente clase de artículo:

class Item < ActiveRecord::Base
      has_many :catalog_items
      has_many :catalogs, :through => :catalog_items
end    

Además, supongamos que CatalogueItems tiene un atributo de posición y que solo hay un CatalogueItem entre cualquier catálogo y cualquier artículo.

La forma más obvia pero ligeramente frustrante de recuperar el atributo de posición es:

@item         = Item.find(4)
@catalog      = @item.catalogs.first
@cat_item     = @item.catalog_items.first(:conditions => {:catalog_id => @catalog.id})
position      = @cat_item.position

Esto es molesto porque parece que deberíamos poder hacer @ item.catalogs.first.position ya que hemos especificado completamente qué posición queremos: la que corresponde al primero de los catálogos de @ item.

La única forma en que he encontrado para obtener esto es:

class Item < ActiveRecord::Base
      has_many :catalog_items
      has_many :catalogs, :through => :catalog_items, :select => "catalogue_items.position, catalogs.*"
end

Ahora puedo hacer Item.catalogs.first.position. Sin embargo, esto parece un truco: estoy agregando un atributo adicional a una instancia de Catálogo. También abre la posibilidad de intentar usar una vista en dos situaciones diferentes en las que relleno @catalogs con un Catalog.find o con un @ item.catalogs. En un caso, la posición estará allí, y en el otro, no.

¿Alguien tiene una buena solución para esto?

Gracias.

Respuestas a la pregunta(4)

Su respuesta a la pregunta