2017-12-14 1 views
0

Ich habe Modell Category, die rekursive parent_id Spalte hat. Inside DB habe ich sql_view (die nur readonly) Join-Tabelle erstellt (mit rekursiven Postgres-Funktion, db verwaltet automatisch alle Beziehungen, einfach "creates" ancestor_id & descendent_id für jedes verwandte Kategorie-Paar), um hierarchische Beziehungen zu schmeicheln.postgresql Ansicht beitreten Tabelle & has_and_belongs_to_many_association, wie Sie Callbacks überspringen

class Category < ActiveRecord::Base 
    belongs_to :parent, 
      class_name: 'Category', 
      foreign_key: :parent_id 

    has_and_belongs_to_many :category_ancestors, 
          class_name: 'Category', 
          join_table: 'category_ancestors', 
          foreign_key: :descendent_id, 
          association_foreign_key: :ancestor_id 

    has_and_belongs_to_many :category_descendents, 
          class_name: 'Category', 
          join_table: 'category_ancestors', 
          foreign_key: :ancestor_id, 
          association_foreign_key: :descendent_id 
end 

Damit kann ich nur

some_category.category_ancestors 
    some_another.category_descendents 

Mit parent_id Speichern verwenden.

Das Problem ist, nach dem Entfernen der Kategorie, ActiveRecord automatisch versucht, alle verwandten Datensätze aus category_ancestors Tabelle zu entfernen, die readonly ist und eine Ausnahme darüber auslöst.

Gibt es eine Möglichkeit, ActiveRecord anzuweisen, nicht zu versuchen, join_table-Datensätze zu aktualisieren? Ich habe versucht, automatisch zu speichern: falsch, ohne Erfolg.

Antwort

0

Haben Sie die autosave Option für has_and_belongs_to_many Verbindung probiert?

Auch wenn ich glaube, Sie es zu viel komplizierter machen, da ich Rails verwenden Ich habe nicht das Bedürfnis hatte Datenbank-Views zu verwenden, haben einen Blick auf diese:

http://guides.rubyonrails.org/association_basics.html#self-joins