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

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

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

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

"имя" "жители.имя" "штат.имя"

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

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

Итак, что вы думаете?

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

"резидент.име нравится" #{значение}%'"

К этому:

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

1 ответ

Решение

Вы должны быть в состоянии использовать Арела, как это.

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.

Другие вопросы по тегам