PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Rails / postgres, 'khóa ngoại' được lưu trữ trong mảng để tạo liên kết 1-nhiều

Bạn sẽ không thể làm cho Rails biết về mảng này và sử dụng nó cho các liên kết.

Nhưng nếu bạn muốn tìm kiếm / lọc nhanh hơn các Nhiệm vụ được giao cho người dùng, bạn có thể giữ một mảng ID Người dùng trong đối tượng Nhiệm vụ. Nếu không, bạn phải thực hiện JOIN để tìm tất cả các nhiệm vụ được giao cho Alice, trong bảng liên kết tiêu chuẩn của bạn.

Vì vậy, giải pháp là giữ bảng liên kết nhưng cũng sao chép User ID của người được chỉ định vào đối tượng Task và sử dụng danh sách ID đó để tìm kiếm / lọc nhanh hơn.

Bạn sẽ cần nối vào after_createafter_destroy vòng đời cho các đối tượng người được giao và chèn ID người được giao mới vào mảng bản ghi tác vụ. Và sau đó khi một người không cố định được xóa khỏi một nhiệm vụ, hãy cập nhật mảng để xóa ID.

Xem tài liệu Postgres cho tất cả các toán tử Mảng:

Một cái gì đó như thế này:

class Task < ActiveRecord::Base
    has_many :assignees, :dependent => :destroy
end

class Asignee < ActiveRecord::Base

    belongs_to :task
    after_create :insert_task_assignee
    after_destroy :remove_task_assignee

    # assumes that there is a column called assignee_id
    # that contains the User ID of the assigned person

    private

    def insert_task_assignee
        # TODO: check for duplicates here - before we naively push it on?
        task.assignee_list = task.assignee_list.push(assignee_id)
        task.assignee_list.save
    end

    def remove_task_assignee
        id_list = task.assignee_list
        id_list.reject! { |candidate_id| candidate_id == assignee_id }
        task.assignee_list = id_list
        task.assignee_list.save
    end

end

# find all tasks that have been assigned Alice & Bob
# this will require the `postgres_ext` gem for Ruby / Postgres array searching
tasks = Task.where.contains(:assignee_list => [alice.id, bob.id]).all



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sao chép trong Postgresql:Đường dẫn tuyệt đối được hiểu là Đường dẫn tương đối

  2. lỗi với cơ sở dữ liệu postgresql:Máy chủ đang chạy cục bộ và chấp nhận các kết nối trên ổ cắm miền Unix /var/run/postgresql/.s.PGSQL.5432?

  3. Chỉ mục duy nhất trên các phân vùng postgresql

  4. Grib2 đến PostGIS raster - có ai làm việc này không?

  5. Chuỗi truy vấn cho vòng lặp `for await` cho trình trợ giúp giao dịch postgresql