sql >> Database teknologi >  >> RDS >> PostgreSQL

Skinner/postgres, 'fremmednøgler' gemt i array for at skabe 1-mange association

Du vil ikke være i stand til at gøre Rails opmærksom på dette array og bruge det til associationer.

Men hvis du ønsker hurtigere søgning / filtrering af opgaver, der er tildelt til brugere, kan du beholde en række bruger-id'er i opgaveobjektet. Ellers skal du lave en JOIN for at finde alle opgaver, der er tildelt Alice, i din standardtilknytningstabel.

Så løsningen er at beholde tilknytningstabellen, men også duplikere den tildelte bruger-id til opgaveobjektet og bruge denne ID-liste til hurtigere søgning/filtrering.

Du bliver nødt til at tilslutte dig after_create og after_destroy livscyklus for tildelte objekter og indsæt nye tildelte ID'er i opgaveregistreringsarrayet. Og så, når en tildelt modtager fjernes fra en opgave, opdatere arrayet for at fjerne ID'et.

Se Postgres-dokumenter for alle Array-operatorerne:

Noget som dette:

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. Stream binær fil fra MySQL for at downloade med PHP

  2. Sampling fra Oracle, brug for nøjagtigt antal resultater (Sample Clause)

  3. Tilføj dynamisk en kolonne med flere værdier til enhver tabel ved hjælp af en PL/pgSQL-funktion

  4. Hvordan opretter og gemmer jeg md5-adgangskoder i mysql