Anda tidak akan dapat membuat Rails mengetahui array ini dan menggunakannya untuk asosiasi.
Tetapi jika Anda ingin pencarian/pemfilteran yang lebih cepat dari Tugas yang diberikan kepada pengguna, Anda dapat menyimpan serangkaian ID Pengguna di objek Tugas. Jika tidak, Anda harus melakukan GABUNG untuk menemukan semua tugas yang diberikan kepada Alice, di tabel asosiasi standar Anda.
Jadi solusinya adalah menyimpan tabel asosiasi tetapi juga menggandakan ID Pengguna penerima tugas ke dalam objek Tugas dan menggunakan daftar ID tersebut untuk pencarian/pemfilteran yang lebih cepat.
Anda harus menghubungkan ke after_create
dan after_destroy
siklus hidup untuk objek penerima tugas dan masukkan ID Penerima Tugas baru ke dalam larik catatan Tugas. Dan kemudian ketika penerima tugas dihapus dari tugas, perbarui larik untuk menghapus ID.
Lihat dokumen Postgres untuk semua operator Array:
Sesuatu seperti ini:
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