Long Hoang

People often call me Tobi, but you can call me tonight!

Navigation
 » Home
 » About Me
 » Github
 » XML Feed

Rails postgres array type

05 Feb 2017 » rails, postgres

Rails hỗ trợ rất tốt kiểu type array của Postgres. Đây kiểu dữ liệu rất ích với những vấn đề liên quan đến tags,.. Giả dụ vấn đề đặt ra là search like tìm những bài báo có chứa bất kì tag nào like với chuối string đưa vào.

Tạo một bài báo có column là tags

rails g model Article name:text tags:text

Thay đổi một chút trong migration

class CreateArticles < ActiveRecord::Migration[5.0]
  def change
    create_table :articles do |t|
      t.text :name
      t.text :tags, array: true, default: []

      t.timestamps
    end
  end
end

Thêm dữ liệu vào bảng Articles

Article.create!(name: 'Traitors Of Time', tags: ['news', 'research', 'scence'])
Article.create!(name: 'Traitors Of Time', tags: {technical, biology, scence})
Article.create!(name: 'Traitors Of Time', tags: ARRAY['comic', 'research', 'scence'])

Nếu muốn tìm chính bài báo có chính xác tên của tag. Ta có hàm ANY

Article.where(":name = ANY(tags)", name: "news")

ANY không thể search với ilike

Nếu muốn search ilike với tag bất kì,ta có thể sử dụng array_to_string:

Article.where("array_to_string(tags, '||') ILIKE :name", name: "%string%")

Tuy nhiên cách này chỉ thích hợp nếu số lượng record không quá lớn, khoảng vài trăm trở lại.