filtrar los resultados de la matriz con la condición en Ruby on Rails 3.2

Tengo esta acción para en mi post_controller.rb:

def index
   @search = Post.solr_search do |s|
     s.fulltext params[:search]
     s.keywords params[:search]
     s.order_by :created_at, :desc
     s.paginate :page => params[:page], :per_page => 1

   end
   @posts = @search.results
   ).page(params[:page]).per(20)
    respond_to do |format|
    format.html # index.html.erb
    format.xml  { render :xml => @posts }
    format.json { render :json => @posts }
  end 
 end

la variable de instancia @posts es una matriz.

El modelo de publicación tiene un atributo language.

quiero entrar en matriz @posts solo publicaciones con @post.language == "en"

Estoy usando mongoid odm.

¿Cómo puedo hacerlo?

¡Gracias!

preguntado el 22 de mayo de 12 a las 17:05

3 Respuestas

Enumerable es su respuesta!

@en_posts = @posts.find_all { |post| post.language == 'en' }

contestado el 22 de mayo de 12 a las 18:05

¿Por qué post.language es una instancia de MicrofuncsController en lugar de una instancia de String? - DVG

lo siento pero me sale error undefined method eq for #<PostsController:0xbefd318> Estoy utilizando mongoide - hiperrjas

Lo siento, fue un error con otro proyecto. Se corrigió el error del comentario - hiperrjas

In rails c, que muestra cuando lo haces Post.first.language.class? Todavía no tiene sentido por qué post.language le daría una referencia a su controlador cuando está trabajando con un objeto modelo, mongoide o no. - DVG

1.9.3p125 :005 > Post.first.language.class => String - hiperrjas

El problema fue solucionado. He agregado esta condición a la mancha solar:

       if params[:locale].present?
        s.with(:language, params[:locale])
       else
        params[:locale] = I18n.locale
        s.with(:language, params[:locale])
       end

entonces el metodo seria:

def index
   @search = Post.solr_search do |s|
     s.fulltext params[:search]
     s.keywords params[:search]
     s.order_by :created_at, :desc
     s.paginate :page => params[:page], :per_page => 1

         if params[:locale].present?
           s.with(:language, params[:locale])
          else
           params[:locale] = I18n.locale
           s.with(:language, params[:locale])
         end

   end
   @posts = @search.results
   ).page(params[:page]).per(20)
    respond_to do |format|
    format.html # index.html.erb
    format.xml  { render :xml => @posts }
    format.json { render :json => @posts }
  end 


 end

Muchas gracias!

contestado el 22 de mayo de 12 a las 19:05

Si desea abarcarlo bajo @posts tu puedes hacer:

@posts.where(language: 'en')

O de forma genérica

Post.where(language: 'en')

contestado el 22 de mayo de 12 a las 17:05

Lo siento, pero uso mongoid y @posts es una matriz. No funciona bien con where, o encuentra métodos con matrices. - hiperrjas

Ups, puede ser malo, lo siento. No vi la parte mongoide en negrita, déjame editar - rogeliog

¿Afecta la regulación de la @search.results devuelve un Mongoid::Criteria? - rogeliog

He añadido la solución :D. ¡Muchas gracias! - hiperrjas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.