45339

[code]

    create table posts (
      id integer,
      tags json
    );
    
[/code]

上記のようなテーブルがあり、 tags には タグ(文字列) の配列が json として入っているとします。

[code]

    mysql> select * from posts;
    +------+-----------------+
    | id   | tags            |
    +------+-----------------+
    |    1 | ["c++", "java"] |
    |    2 | ["ruby"]        |
    |    3 | ["c++"]         |
    +------+-----------------+
    
[/code]

たとえば、 c++ が入っている Post を取得するには、 sql においては、

[code]

    select * from posts where JSON_CONTAINS(tags, '"c++"', '$');
    
[/code]

を実行すればよいですが、これを active record 上からどうやったら実行できるのか、と思っています。

### 質問

上記テーブルに対して、 Post モデルを次のように定義したとします。

[code]

    class Post < ApplicationRecord
    end
    
[/code]

Post から、 c++ のタグが含まれる Relation を作成するにはどうしたらよいでしょうか?


CC BY-SA 4.0
2018-07-05T14:13:19.483
45337
2018-07-05T14:42:37.640
754
question
ruby-on-rails mysql json rails-activerecord
active record で JSON_CONTAINS で where を実行したい


[`find_by_sql`で検索する](https://railsguides.jp/active_record_querying.html#sql%E3%81%A7%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B)
方法で解決できると思います。

[code]

    Post.find_by_sql(%Q{SELECT * FROM POSTS WHERE JSON_CONTAINS(tags, '"c++"', '$')})
    
[/code]


CC BY-SA 4.0
2018-07-05T14:25:45.773
45338
2018-07-05T14:25:45.773
45337
answer

[code]

    irb(main):015:0> Post.where("JSON_CONTAINS(tags, ?, '$')", 'c++'.to_json)                
      Post Load (0.8ms)  SELECT  `posts`.* FROM `posts` WHERE (JSON_CONTAINS(tags, '\"c++\"', '$')) LIMIT 11
    => #<ActiveRecord::Relation [#<Post id: 1, tags: ["c++", "java"]>, #<Post id: 3, tags: ["c++"]>]>
    
[/code]

普通に where が書けるのですね。


CC BY-SA 4.0
2018-07-05T14:42:37.640
45339
2018-07-05T14:42:37.640
754
45337
answer