Как я могу преобразовать это в MetaWhere или Arel?

Рассмотрим модель города, имеющую:

  def self.search(field, search)
    if search
      where("#{field} LIKE ?", "%#{search}%")
    else
      scoped
    end
  end

Как я могу использовать Arel или Metawhere в этой ситуации, зная, что поле является строкой, может иметь что-то вроде:

"имя" "резиденты.имя" "штат.название"

Я хочу сделать что-то подобное (не будет работать):

  def self.search(field, search)
    if search
       where(field =~ "%#{search}%")
    else
      scoped
    end
  end

Итак, каковы ваши мысли?

Реальный вопрос в том, как я могу преобразовать это:

"резиденты.имя НРАВИТСЯ '#{значение}%'"

К тому, что:

:резиденты => { :name =~ "#{значение}%" }


person Community    schedule 23.04.2011    source источник
comment
Похоже, мне придется вернуться к SearchLogic. Проклятие.   -  person    schedule 23.04.2011


Ответы (1)


Вы должны быть в состоянии использовать Arel таким образом.

def self.search(field, search)
  if search
    if field =~ /\./ # table and field
      table, field = field.split('.')
      arel_join = table.singularize.camelize.constantize.arel_table
      joins(table.to_sym).where(arel_join[field].matches("%#{search}%"))
    else
      where(Resource.arel_table[field].matches("%#{search}%"))
    end
  else
    scoped
  end
end

Существует Railscast, в котором хорошо объясняются основы используя Arel в Rails 3.

person aNoble    schedule 23.04.2011
comment
когда у меня только первый уровень работает нормально. но это: arel_table[ Residents.name].matches... похоже, не работает - person ; 23.04.2011
comment
Вы правы, я пропустил это требование. Я пересмотрел приведенный выше код, чтобы он поддерживал передачу полей для объединенных таблиц. Это не самый чистый код, но он должен работать. - person aNoble; 23.04.2011
comment
arel должен был это реализовать. Не всегда можно рассчитывать на символы, особенно когда представление отвечает за выбор параметров поиска. - person ; 23.04.2011