sql >> Databáze >  >> RDS >> PostgreSQL

Rails/postgres, 'cizí klíče' uložené v poli pro vytvoření asociace 1-many

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



  1. MySQL získá počet záznamů po hodinách, dokonce i hodiny bez záznamů

  2. NodeJS a Express:Chyba:certifikát s vlastním podpisem

  3. Návrh databáze:Složený klíč vs. primární klíč s jedním sloupcem

  4. Identifikátor ORA-00972 je příliš dlouhý alias název sloupce