U kunt Rails niet op de hoogte stellen van deze array en deze gebruiken voor associaties.
Maar als u sneller wilt zoeken / filteren van taken die aan gebruikers zijn toegewezen, kunt u een reeks gebruikers-ID's in het taakobject bewaren. Anders zou je een JOIN moeten doen om alle taken te vinden die aan Alice zijn toegewezen, in je standaard associatietabel.
De oplossing is dus om de associatietabel te behouden, maar ook om de gebruikers-ID van de toegewezen persoon in het taakobject te dupliceren en die ID-lijst te gebruiken voor sneller zoeken/filteren.
Je moet inhaken op de after_create
en after_destroy
levenscyclus voor de toegewezen objecten en voeg nieuwe toewijzings-ID's in de taakrecordarray in. En wanneer een toegewezen persoon uit een taak wordt verwijderd, moet de array worden bijgewerkt om de ID te verwijderen.
Zie Postgres-documenten voor alle array-operators:
Zoiets als dit:
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