2012-09-21 25 views
10

Estoy un poco confundido con el uso de una búsqueda avanzada de registros. Estoy intentando hacer una búsqueda personalizada donde no todos los nombres de las tablas se pueden seleccionar como términos de búsqueda y no se usan todos los predicados. Usé railscast como tutorial para esto, pero no encuentro nada sobre cómo limitar el número de predicados. ¿Existe también la posibilidad de utilizar los nombres de campos de tabla y precarios en diferentes idiomas (solo etiquetas)?Gema de Ransack elegir predicados y nombres de predicados personalizados

Mi búsqueda

= search_form_for @q, :url => search_offers_path, :html => { :method => :post } do |f| 
    = f.condition_fields do |c| 
    .field 
     = f.attribute_fields do |a| 
     = a.attribute_select 
     = f.predicate_select 
     = f.value_fields do |v| 
     = v.text_field :value 
     = link_to "#{t :destroy}", '#', class: "remove_fields" 

    = link_to_add_fields "#{t :add}", f, :condition 

    .field 
    = t :sort 
    = f.sort_fields do |s| 
     = s.sort_select 

    = f.submit "#{t :search}" 

Mi controlador

def index 
    select_offers = Offer.where { (user_id != id) & (ended == false) & ((created_at + life_time) > DateTime.now) } 
    @q = select_offers.search(params[:q]) 
    @offers = @q.result(:distinct => true).page(params[:page]) 
    @q.build_condition 
    @q.build_sort if @q.sorts.empty? 
end 

Respuesta

18

he encontrado una solución. Para cambiar las etiquetas de predicado utilicé i18n.

en.yml 

ransack: 
    asc: "ascending" 
    desc: "descending" 
    predicates: 
    cont: "contains" 
    not_cont: "not contains" 
    start: "starts with" 
    end: "ends with" 
    gt: "greater than" 
    lt: "less than" 
    ... 

También hay una posibilidad de cambiar los nombres de los campos de atributos

attributes: 
    model_name: 
    model_field1: "field name1" 
    model_field2: "field name2" 
    ... 

para limitar la búsqueda predicados en lugar de

= f.predicate_select 

Solía ​​

= f.attribute_fields do |a| 
    = a.attribute_select 
= f.select :p, { 'custom predicate name1' => :predicate1, 'custom predicate name2' => :predicate2 } 

Para Limitar la tabla de búsqueda fi campos que añaden a modelar

UNRANSACKABLE_ATTRIBUTES = ["id", "published", "created_at"] 

def self.ransackable_attributes auth_object = nil 
    (column_names - UNRANSACKABLE_ATTRIBUTES) + _ransackers.keys 
end 
+0

Fantástico Pregunta y respuesta, felicidades a eso, ya que parece que recientemente has profundizado en Ransack, ¿podrías echar un vistazo a mi pregunta? Http://stackoverflow.com/questions/13241481/in-form-sorting -using-ransack-gem-not-working Realmente podría necesitar ayuda, ¡estoy realmente atascado! Gracias – jlstr

+0

Hola, lo siento molestarlo de nuevo, ¿sabe si hay una forma de excluir ciertos métodos en la matriz UNRANSACKABLE_ATTRIBUTES? Por ejemplo, me gustaría excluir los métodos creados por las relaciones, en mi caso, un producto pertenece a un tipo de producto y el tipo de producto aparece en el menú desplegable. ¿Hay un modo de quitarlo? ¡Gracias por adelantado! – jlstr

+0

Puede verificar todos los predicados aquí: https://github.com/activerecord-hackery/ransack/blob/master/lib/ransack/constants.rb –

8

Para límite de los predicados en la predicate_select asistente de formulario se puede pasar un array como: only-opción:

<%= f.predicate_select only: [:cont, :not_cont, :eq, :not_eq, :blank, :null, :not_null] %> 

Por desgracia, el orden de los elementos en el arreglo pasado doesn 't importa para ordenar los predicados no funciona de esta manera.


Si no te gusta los compuestos (_any & _all) o ni siquiera saben lo que son buenos para (como yo) También puede pasar el: compuestos opción:

<%= f.predicate_select compounds: false %> 

Espero que haya ayudado. Ernie hizo muchas cosas interesantes y asombrosas hasta ahora, pero sus documentos son una especie de cinta adhesiva: muy, muy delgada y te quedarás atascado si tratas de ponerla en tus manos.

+1

¡Muchas gracias por la explicación de los compuestos! – daveomcd

+0

Finalmente - ¡Puedo matar los compuestos envenenados! – ineedahero

Cuestiones relacionadas