Relaciones entre tablas y acceso a ellas

Buenas, tengo una pequeña duda respecto a como acceder a una tabla de mi
base de datos; os explico un poco:

Tengo la tabla products y la tabla products_descriptions. Esta última
tiene el campo products_name que es al que deseo acceder y las
relaciones entre ambas tablas son:

*Products -> has_many :product_descriptions (Puesto que un producto
tendrá descripciones en diferentes idiomas).
*product_descriptions -> belongs_to :products

Me gustaría acceder al campo products_name des del listado de productos
pero no logro hacerlo. Des del listado de products_descriptions se puede
acceder a los campos de la tabla products haciendo simplemente:

<%= products_descriptions.products.NombreDelCampo %>

Pero a la inversa no se la forma de hacerlo. Supongo que es debido a que
estan los nombres en distintos idiomas para un mismo “product_id” dentro
de la tabla product_description no?

Muchas grácias!

Hola,

*Products -> has_many :product_descriptions (Puesto que un producto
tendrá descripciones en diferentes idiomas).
*product_descriptions -> belongs_to :products

una relación 1 a N implica que en un extremo de la relación tienes un
elemento y en el otro tienes muchos. Si estás en un objeto de la parte
correspodiente a “muchos” (el modelo que “belongs_to” al otro) entonces
acceder es tan simple como tú dices

<%= products_descriptions.products.NombreDelCampo %>

… ya que en ese caso no hay ambigüedad posible. Para cada uno de los
modelos del extremo N hay un único elemento en el lado “1” de la
relación.

Cuando ves la relación desde el otro lado, las cosas cambian. A cada
objeto del lado “1” le corresponden varios (has_many) objetos del otro
lado. Por eso mismo lo que tienes si haces

products.products_descriptions

… es una lista de objetos products_descriptions. Para acceder a cada
uno de los campos de cada uno de los objetos en esa lista tendrás que o
bien iterar por ella (con un .each) o bien acceder directamente al
elemento que te interese (con un [index], donde index es un número que
empieza por cero, claro)

por ejemplo: products.products_descriptions[0].name

te daría el name del primer products_descriptions (asumiendo que las
relaciones están bien definidas y que efectivamente existe al menos un
products_description asociado. Si no te daría una exception).

saludos,

javier ramirez

… ya que en ese caso no hay ambigüedad posible. Para cada uno de los
modelos del extremo N hay un único elemento en el lado “1” de la
relación.

Cuando ves la relación desde el otro lado, las cosas cambian. A cada
objeto del lado “1” le corresponden varios (has_many) objetos del otro
lado. Por eso mismo lo que tienes si haces

products.products_descriptions

… es una lista de objetos products_descriptions. Para acceder a cada
uno de los campos de cada uno de los objetos en esa lista tendrás que o
bien iterar por ella (con un .each) o bien acceder directamente al
elemento que te interese (con un [index], donde index es un número que
empieza por cero, claro)

por ejemplo: products.products_descriptions[0].name

te daría el name del primer products_descriptions (asumiendo que las
relaciones están bien definidas y que efectivamente existe al menos un
products_description asociado. Si no te daría una exception).

saludos,

javier ramirez

Muchas grácias, entendía el tema de las relaciones 1 a n pero no sabia
que se podia acceder a ellas como un array con el tema de [index].

Una exlpicación digna de enciclopedia! :stuck_out_tongue: Hasta pronto!