PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Rails/postgres, 'kunci asing' disimpan dalam array untuk membuat asosiasi 1-banyak

Anda tidak akan dapat membuat Rails mengetahui array ini dan menggunakannya untuk asosiasi.

Tetapi jika Anda ingin pencarian/pemfilteran yang lebih cepat dari Tugas yang diberikan kepada pengguna, Anda dapat menyimpan serangkaian ID Pengguna di objek Tugas. Jika tidak, Anda harus melakukan GABUNG untuk menemukan semua tugas yang diberikan kepada Alice, di tabel asosiasi standar Anda.

Jadi solusinya adalah menyimpan tabel asosiasi tetapi juga menggandakan ID Pengguna penerima tugas ke dalam objek Tugas dan menggunakan daftar ID tersebut untuk pencarian/pemfilteran yang lebih cepat.

Anda harus menghubungkan ke after_create dan after_destroy siklus hidup untuk objek penerima tugas dan masukkan ID Penerima Tugas baru ke dalam larik catatan Tugas. Dan kemudian ketika penerima tugas dihapus dari tugas, perbarui larik untuk menghapus ID.

Lihat dokumen Postgres untuk semua operator Array:

Sesuatu seperti ini:

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. GROUP BY dan agregat nilai numerik berurutan

  2. Bagaimana cara menggunakan Rails dengan nama kolom huruf besar?

  3. Membuat salinan database di PostgreSQL

  4. Bagaimana cara mendapatkan nomor ganti?

  5. Bagaimana Anda bisa memperluas baris PostgreSQL yang diringkas menjadi kolom terpisah?