sql >> Database >  >> RDS >> PostgreSQL

Rails/postgres, 'buitenlandse sleutels' opgeslagen in array om 1-veel associaties te creëren

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



  1. Databaseontwerp met prijsregels voor hotelreserveringssysteem

  2. RazorSQL verbinden met Salesforce.com

  3. Veldnamen ophalen uit tijdelijke tabel (SQL Server 2008)

  4. PHP / MySQL Ticket Response - E-mail antwoord opslaan in database?