PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Rails/postgres, „чужди ключове“, съхранени в масив за създаване на асоциация 1-много

Няма да можете да информирате Rails за този масив и да го използвате за асоциации.

Но ако искате по-бързо търсене/филтриране на задачи, възложени на потребители, можете да запазите масив от потребителски идентификатори в обекта на задачата. В противен случай ще трябва да направите JOIN, за да намерите всички задачи, възложени на Alice, във вашата стандартна таблица за асоцииране.

Така че решението е да запазите таблицата за асоцииране, но също така да дублирате потребителския идентификатор на получателя в обекта Task и да използвате този списък с идентификатори за по-бързо търсене/филтриране.

Ще трябва да се свържете с after_create и after_destroy жизнен цикъл за обектите на възложител и вмъкнете нови идентификатори на получателя в масива със записи на задача. И след това, когато назначено лице бъде премахнато от задача, актуализирайте масива, за да премахнете идентификатора.

Вижте документите на Postgres за всички оператори за масиви:

Нещо подобно:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Мога ли да използвам ключова дума на Postgres като псевдоним в списъка за избор?

  2. Psycopg2, Postgresql, Python:Най-бързият начин за групово вмъкване

  3. Прескачане на пропуск в SQL при специфично условие и правилно използване на lead().

  4. Клаузите WHERE и JOIN подреждат изпълнението

  5. Защо всичките ми таблици в Rails 4/Postgres се създават с измерение 1?