2016-11-02 2 views
1

Ich habe Modelle für Organisation und Package_ip.Rails - Polymorphic Associations mit hat viele Beziehung - Indexwerte

Die Verbände sind:

Organisation

has_many :ips, as: :ipable, class_name: Package::Ip 
    accepts_nested_attributes_for :ips, reject_if: :all_blank, allow_destroy: true 

Paket :: Ip

belongs_to :ipable, :polymorphic => true, optional: true, inverse_of: :ip 

Die Package_ips Tabelle hat:

create_table "package_ips", force: :cascade do |t| 
    t.string "identifier" 
    t.text  "description" 
    t.text  "conditions" 
    t.integer "ipable_id" 
    t.string "ipable_type" 
    t.datetime "created_at",  null: false 
    t.datetime "updated_at",  null: false 
    t.string "title" 
    t.string "status" 
    t.string "classification" 
    t.index ["ipable_type", "ipable_id"], name: "index_package_ips_on_ipable_type_and_ipable_id", unique: true, using: :btree 
    end 

Mein Ziel ist es für Organisationen cr eate viele Instanzen von package_ip.

Ich habe ein Problem jedoch mit der Art, wie der Index funktioniert. Wenn ich eine zweite Instanz von package_ip erstellen möchte, erhalte ich einen Fehler, der besagt, dass die Indexwerte nicht länger eindeutig sind.

Bin ich in Ordnung, die eindeutige Einschränkung aus meinem Index zu entfernen? Mir ist klar, dass die ipable_ip die organisation.id sein wird und der ipable_type die Elternklasse (Organisation) sein wird. Ich verstehe nicht, warum das einzigartig sein muss. Aber vielleicht habe ich etwas an polymorphen Assoziationen und der Abhängigkeit vom Index verpasst.

Antwort

0

Ja, diese Einschränkung stammt von Ihrer Geschäftslogik und ist nicht in Schienen integriert. Schienen sollten Ihnen erlauben, die eindeutige Einschränkung fallen zu lassen, es wäre klug, sicherzustellen, dass Ihre Geschäftslogik sicher ist, damit umzugehen.

Möglicherweise haben Sie Code wie:

foo_ip org.ips.where(type: "foo").first

Dies würde hoffentlich leben in einem benannten Umfang, wenn es existiert.

Aktualisierung nach Kommentar: Vermutlich verwenden Sie IPs als "Intellectual Properties".

Nehmen wir an, Sie

class Song < Package::Ip 
end 

class ThemeSong < Song 
end 

class Logo < Package::IP 
end 

Sie haben Business-Logik haben, die eine Organisation genau ein Titelsong oder genau ein Logo haben erwartet.

So können Sie Code wie:

theme = org.theme_songs.first 

oder:

logo = org.logos.first 

# Or worse yet 
logo = org.ips.where(:type = "Logo").first 

So, während Rails mehrere unterstützt Song s oder Logo s, stellen Sie sicher, dass Ihre Business-Logik nimmt nicht nur die erstens in einigen Fällen.

+0

Ich bin mir nicht sicher, ob ich verstehe, was Sie mit Ihrem Beispiel meinen. Ich möchte Organization.ips testen und ich möchte, dass ein Array von IP-Instanzen zurückgegeben wird, die in dieser Organisation erstellt wurden. – Mel

+0

Aktualisiert mit einigen Beispielen, worauf zu achten ist. – EnabrenTane