Problema con find()

Hola tengo un problemilla, verán on logro pasar el valor de
@sub_categorias.categoria_id
para lograr filtrar mis categorias en el list.

def list
@sub_categoria_pages, @sub_categorias = paginate :sub_categorias,
:per_page => 10
@categoria = Categoria.find(:all, :conditions => { :id =>
@sub_categorias.categoria_id })
end

me sale este error

undefined method `categoria_id’ for #Array:0x344bfd0

pero si hago por ejemplo:

def list
@sub_categoria_pages, @sub_categorias = paginate :sub_categorias,
:per_page => 10
@categoria = Categoria.find(:all, :conditions => { :id => 1 })
end

me funciona… por que puede ser el error?

Saludos

Atte.
Miguel Michelson Martinez

El 14/09/07, Miguel M. [email protected]
escribió:> end

def list

El problema está en que con el método paginate obtienes un array de
elementos. Es decir, @sub_categorias es un array (un conjunto
ordenado) de elementos. Por lo tanto, @sub_categorias no es un objeto
de la clase SubCategorias. Así, si quieres acceder a categoria_id
debes elegir primero uno de los elementos, ya sea el primero, el
último o el n-ésimo (para n entre uno y el número de elementos de
@sub_categorias [1]). Por ejemplo, el siguiente código sí que es
válido:

def list
@sub_categoria_pages, @sub_categorias = paginate :sub_categorias,
:per_page => 10
@categoria = Categoria.find(:all, :conditions => { :id =>
@sub_categorias[0].categoria_id })
end

Además, si @sub_categorias pudiera estar vacío, añadiría algo
así:
def list
@sub_categoria_pages, @sub_categorias = paginate :sub_categorias,
:per_page => 10
@categoria = unless @sub_categorias[0].empty?
Categoria.find(:all, :conditions =>
{ :id => @sub_categorias[0].categoria_id })
else
valor_de_categoria_si_no_hay_sub_categorias
end
end

Un saludo,

Serabe

[1] Lo siento, no puedo evitarlo, estudio la carrera de matemáticas y
me expreso así de raro

.

On 14/09/2007, Miguel M. [email protected] wrote:

me sale este error

undefined method `categoria_id’ for #Array:0x344bfd0

Lee con calma los mensajes de error, que no solo tiene que causar
alarma sino que suele traer información útil sobre las causas del
errror.

Se trata de exactamente lo que te dice, @sub_categorias es un array
de objetos y por tanto no tiene ese método. Tendrías que extraer
alguno de los elementos (primero, úlitmo …) o bien iterar por el
array para hacer el find por cada elemento, en función de lo que
necesites.


Manuel, que
piensa que eres una excelente persona y medra en torno a
http://simplelogica.net y/o http://simplelogica.net/logicola/
Recuerda comer mucha fruta y verdura.

mmm… no pero ahi solo tomo el valor del primer elemento del array

@categoria = Categoria.find(:all, :conditions => { :id =>
@sub_categorias[0].categoria

_id })

mi idea es que cada registro del list @sub_categorias se relacione con
@categorias , por su valor de categoria_id.

al hacer eso me lista solo el valor del primer registro y luego tepite
el
mismo resultado para los otros registros, entonces si el primero llama a
la
categoria , libros_rojos… todo los otros registros aparecen con los
libros
rojos …

supongo que habria que hacer iterar el @sub_categorias[n]

@categoria = Categoria.find(:all, :conditions => { :id =>
@sub_categorias[n].categoria

_id })

como hago para iterar este resultado.
o esta mal planteado esto que explico??

Gracias por su ayuda

Hola Manuel, como estas.

olvide poner que en la vista list de las sub_categorias, estoy haciendo
una
iteraciones a categoria dentro de la iteracion de sub_categorias :

<% for column in SubCategoria.content_columns %> <% end %>

<% for sub_categoria in @sub_categorias %>

<% for categorias in @categoria %> <% end %>
<td><%= link_to 'Show', :action => 'show', :id => sub_categoria 

%>


<% end %>
<%= column.human_name %>
<%= categorias.nombre_cat %> <%= sub_categoria.nombre_sub_cat %> <%= sub_categoria.orden %> <%= sub_categoria.publica %> <%= link_to ‘Edit’, :action => ‘edit’, :id => sub_categoria
%>
<%= link_to ‘Destroy’, { :action => ‘destroy’, :id =>
sub_categoria
}, :confirm => ‘Are you sure?’, :method => :post %>

<%= link_to ‘Previous page’, { :page =>
@sub_categoria_pages.current.previous } if
@sub_categoria_pages.current.previous %>
<%= link_to ‘Next page’, { :page => @sub_categoria_pages.current.next }
if
@sub_categoria_pages.current.next %>

en mi controlador tengo lo siguiente:

def list
@sub_categoria_pages, @sub_categorias = paginate :sub_categorias,
:per_page => 10
@categoria = Categoria.find(:all, :conditions => { :id =>
@sub_categorias.categoria_id })
end

pero el error es :
undefined method `categoria_id’ for #Array:0x35370d4

pero es raro porque si hago esto @categoria = Categoria.find(:all,
:conditions => { :id => 1})
.por ejemplo puedo acceder al valor de <%= categorias.nombre_cat %>, en
la
vista list

entonces creo que el problema es que no puedo acceder al valor de
@sub_categorias.categoria_id
en el controlador, pero categoria_id, existe como nombre de campo de la
tabla sub_categorias.

cual puede estar haciendo mal???

Gracias

On 9/14/07, Manuel González Noriega [email protected]

Hola Serabe , Gracias por tu ayuda…

el codigo no me resulto, pero tu pregunta final me dio una buena
respuesta.

porque tenia la relacion hecha, en los modelos habia declarado que
categorias has_many sub_categorias y sub_categorias belongs_to:
categorias

mi problema es que pensaba que se tenia que recorrer los resultados en
cada
metodo de clase. osea que habia que hacer doble trabajo. establer la
relacion en los modelos y recorrer los resultados con un find en cada
metodo…
y veo que no es asi :slight_smile:

de todas formas gracias por mostrarme como se puede acceder a los datos
del
array, voy a estudiarlo tambien.

Muchas Gracias por la ayuda

Utiliza lo siguiente:

@categorias = []
@sub_categorias.each do |sc|
@categorias << Categoria.find(:all, :conditions => { :id =>
sc.categoria_id })
end

Entonces, en @categorias[n] tienes las categorias de
@sub_categorias[n]. Por otra parte, ¿por qué no estableces una
relación entre SubCategoria y Categoria de forma que puedas acceder a
las categorías de una subcategoría en la forma
sub_categoria.categorias?

Un saludo,

Serabe