

<http://tutty.info/521>  
このようなクエリをActiverecordで実行するにはどうしたらよいでしょうか


CC BY-SA 3.0
2015-04-16T02:04:07.057
9213
2016-03-14T04:18:09.060
2015-04-18T05:46:38.200
8000
5855
question
rails-activerecord
activerecordでデータのスペースを無視して検索


[`where`](http://apidock.com/rails/ActiveRecord/QueryMethods/where)、または[`find_by_sql`](http://apidock.com/rails/ActiveRecord/Querying/find_by_sql)を使ったらどうですか？

[code]

    T.where("REPLACE(REPLACE(key,' ',''),'　','') LIKE ?", "%検索文字列%")
    T.find_by_sql("SELECT key, value FROM t WHERE REPLACE(REPLACE(key,' ',''),'　','') LIKE ?", "%検索文字列%")
    
[/code]


CC BY-SA 3.0
2015-04-16T02:42:23.047
9214
2015-04-16T02:58:51.377
2015-04-16T02:58:51.377
3371
3371
9213
answer


ActiveRecord (とAREL) だけで無理矢理書こうとするとこんな感じになりますが、直接SQLを書いてしまう方が分かりやすいと思います。

[code]

    Item.where(
      Arel::Nodes::NamedFunction.new(
        "REPLACE", [
          Arel::Nodes::NamedFunction.new(
            "REPLACE",
            [Item.arel_table[:name], "　", ""]
          ),
          " ", ""
        ]
      ).matches("Foo%")
    )
    
[/code]

生成されるSQL文:

[code]

    SELECT "items".* FROM "items"
    WHERE REPLACE(REPLACE("items"."name", '　', ''), ' ', '') LIKE 'Foo%'
    
[/code]

(ユーザからの入力などによって) 動的に条件を変更する場合には良いかもしれません。


CC BY-SA 3.0
2015-09-16T00:58:16.147
16665
2015-09-16T00:58:16.147
76
9213
answer