Nebudete moci informovat Rails o tomto poli a používat je pro asociace.
Pokud však chcete rychlejší vyhledávání / filtrování Úkolů přiřazených uživatelům, můžete v objektu Úkol ponechat pole ID uživatelů. V opačném případě byste museli provést JOIN, abyste našli všechny úkoly přiřazené Alici ve své standardní asociační tabulce.
Řešením je tedy ponechat tabulku přidružení, ale také duplikovat uživatelské ID příjemce do objektu Task a použít tento seznam ID pro rychlejší vyhledávání/filtrování.
Budete se muset připojit k after_create
a after_destroy
životního cyklu pro objekty příjemce a vložte nová ID příjemce do pole záznamu úlohy. A poté, když je z úkolu odebrán příjemce, aktualizujte pole, aby se odstranilo ID.
Všechny operátory pole naleznete v dokumentech Postgres:
Něco takového:
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