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_create
và after_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