Няма да можете да информирате Rails за този масив и да го използвате за асоциации.
Но ако искате по-бързо търсене/филтриране на задачи, възложени на потребители, можете да запазите масив от потребителски идентификатори в обекта на задачата. В противен случай ще трябва да направите JOIN, за да намерите всички задачи, възложени на Alice, във вашата стандартна таблица за асоцииране.
Така че решението е да запазите таблицата за асоцииране, но също така да дублирате потребителския идентификатор на получателя в обекта Task и да използвате този списък с идентификатори за по-бързо търсене/филтриране.
Ще трябва да се свържете с after_create
и after_destroy
жизнен цикъл за обектите на възложител и вмъкнете нови идентификатори на получателя в масива със записи на задача. И след това, когато назначено лице бъде премахнато от задача, актуализирайте масива, за да премахнете идентификатора.
Вижте документите на Postgres за всички оператори за масиви:
Нещо подобно:
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