0

次のような都市モデルを考えてみましょう。

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

フィールドが文字列であることを知っているその状況でArelまたはMetawhereを使用するには、次のようなものがあります。

"name" "residents.name" "state.name"

私はそのようなことをしたい(動作しません):

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

それで、あなたの考えは何ですか?

本当の問題は、どうすればそれを変換できるかということです。

"residents.name LIKE'#{value}%'"

それに:

:residents => {:name =〜 "#{value}%"}

4

1 に答える 1

0

あなたはこのようにアレルを使うことができるはずです。

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

Rails3でArelを使用する基本をうまく説明するRailscastがあります。

于 2011-04-23T03:15:58.407 に答える