如何将其转换为MetaWhere或Arel?

时间:2011-04-23 02:17:26

标签: ruby-on-rails arel meta-where

考虑一个城市模型:

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

在这种情况下我如何使用Arel或Metawhere知道该字段是一个字符串可以有类似的东西:

“名称” “residents.name” “state.name”

我想做那样的事情(不会起作用):

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

那么,你有什么想法?

真正的问题是,我该如何转换它:

“resident.name LIKE'#{value}%'”

对此:

:居民=> {:name =〜“#{value}%”}

1 个答案:

答案 0 :(得分:0)

你应该可以像这样使用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可以很好地解释在Rails 3中使用Arel的基础知识。