1

Ich habe zwei Modelle, Task und Unit. Eine Aufgabe has_many: units. Ich möchte die Einheiten auf der Grundlage einer bestimmten Reihenfolge bestellen. Zum Beispiel: Es gibt zwei Einheiten A und B. A muss vor B abgeschlossen sein. Benutzer können zwischen A und B eine weitere Einheit hinzufügen, zum Beispiel C. Einheit C könnte dann auch gelöscht werden - die Priorität von A und B bleibt erhalten. Was ist der einfachste Weg, dies in Rails zu implementieren?Definieren einer Bestellung zu einer Reihe von verknüpften Datensätzen

Ideen Ich habe in Betracht gezogen:

  1. einen Vorrang Integer-Spalte auf die Einheiten Tabelle hinzufügen, die auf irgendwelchen Operationen aktualisiert werden, die die Sammlung von Einheiten ändern.

  2. Hinzufügen einer Self-Join-Assoziation zum Unit-Modell, die auf die nächste/vorherige Unit verweist, und Ändern der Assoziationen, wenn die Einheiten-Collection geändert wird.

Antwort

1

Der richtige Weg, um Ihr Problem zu modellieren hängt davon ab, wie kompliziert Ihre Aufgabe Strukturen sein werden.

Wenn ein Einheiten der Task immer in first-to-last Ordnung gebracht werden können, wobei jede Einheit eine ganze Zahl, um zu geben wird es am einfachsten machen Einheiten in dieser Reihenfolge mit order in Active oder sort im Speicher zu setzen. Der einzige Nachteil besteht darin, dass Sie beim Hinzufügen oder Entfernen einer Einheit möglicherweise andere Einheiten speichern müssen, um ihre Aufträge zu aktualisieren. Das ist wahrscheinlich kein großer Nachteil, wenn Tasks kleinere Integer-Einheiten haben.

Wenn eine Task Zyklen haben kann, benötigt jede Einheit einen Verweis auf die Einheit, die ihr vorausgeht. Möglicherweise benötigen Sie sogar ein Modell, um die Beziehung zwischen einer Einheit und der Einheit darzustellen, die ihr folgt. Überlegen Sie sich also die Anwendungsfälle, die Sie unterstützen müssen, und sehen Sie, was zutrifft.

+0

Danke für Ihre Einblicke. Ich mag die Idee, ActiveRecord in der Reihenfolge und beim Umgang mit zyklischen Aufgaben zu verwenden. Da ich mich nicht mit zyklischen Aufgaben beschäftigen muss, verwende ich die Integer-Spalte. – hypern

0

Sie können acts_as_votable gem. Diese Migration Ihr Problem lösen kann:

class AddCachedVotesToPosts < ActiveRecord::Migration 
    def self.up 
    add_column :posts, :cached_votes_total, :integer, :default => 0 
    add_column :posts, :cached_votes_score, :integer, :default => 0 
    add_column :posts, :cached_votes_up, :integer, :default => 0 
    add_column :posts, :cached_votes_down, :integer, :default => 0 
    add_column :posts, :cached_weighted_score, :integer, :default => 0 
    add_column :posts, :cached_weighted_total, :integer, :default => 0 
    add_column :posts, :cached_weighted_average, :float, :default => 0.0 
    add_index :posts, :cached_votes_total 
    add_index :posts, :cached_votes_score 
    add_index :posts, :cached_votes_up 
    add_index :posts, :cached_votes_down 
    add_index :posts, :cached_weighted_score 
    add_index :posts, :cached_weighted_total 
    add_index :posts, :cached_weighted_average 

    # Uncomment this line to force caching of existing votes 
    # Post.find_each(&:update_cached_votes) 
    end 

    def self.down 
    remove_column :posts, :cached_votes_total 
    remove_column :posts, :cached_votes_score 
    remove_column :posts, :cached_votes_up 
    remove_column :posts, :cached_votes_down 
    remove_column :posts, :cached_weighted_score 
    remove_column :posts, :cached_weighted_total 
    remove_column :posts, :cached_weighted_average 
    end 
end 

Gerade diese Spalte add_column :posts, :cached_votes_up, :integer, :default => 0 und diesen Index add_index :posts, :cached_votes_score