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.