10

Ich habe ein altes Plugin namens acts_as_habtm_list gefunden - aber es ist für Rails 1.0.0.acts_as_list mit has_and_belongs_to_many Beziehung

Ist diese Funktionalität nun in acts_as_list integriert? Ich kann anscheinend keine Informationen darüber finden.

Grundsätzlich habe ich eine artists_events Tabelle - kein Modell. Die Beziehung wird über diese beiden Modelle gehandhabt: has_and_belongs_to_many

Wie kann ich die Reihenfolge in dieser Situation angeben?

+0

Können Sie genauer sein? Was genau willst du erreichen? Auch ein Link zu dem gefundenen Plugin wäre nett. – EmFi

+0

Als ich nach dem Plugin suchte, fand ich einen neueren, den ich vielleicht verwenden könnte: http://github.com/SFEley/habtm_list Ich versuche, die Reihenfolge der Künstler bei Veranstaltungen zu erreichen - sagen Sie gehen zu ein Konzert mit einem Headliner und zwei Openern. Ich möchte, dass die Reihenfolge angezeigt wird, in der die Künstler spielen. – mculp

Antwort

22

Ich gehe davon aus, dass Sie zwei Modelle haben - Künstler und Event.

Sie möchten eine Beziehung zwischen ihnen haben und Sie möchten eine Reihenfolge der Ereignisse für jeden Künstler definieren können.

Hier ist meine Lösung. Ich schreibe diesen Code von meinem Kopf, aber eine ähnliche Lösung funktioniert in meinem Fall. Ich bin mir ziemlich sicher, dass es Raum für Verbesserungen gibt.

Ich verwende Rails Acts_as_list Plugin.

So habe ich Modelle definieren würde:

class Artist < ActiveRecord::Base 
    has_many :artist_events 
    has_many :events, :through => :artist_events, :order => 'artist_events.position' 
end 

class Event < ActiveRecord::Base 
    has_many :artist_events 
    has_many :artists, :through => :artist_events, :order => 'artist_events.position' 
end 

class ArtistEvent < ActiveRecord::Base 
    default_scope :order => 'position' 
    belongs_to :artist 
    belongs_to :event 
    acts_as_list :scope => :artist 
end 

Wie Sie sehen Sie benötigen ein zusätzliches Modell ArtistEvent, die beiden anderen verbinden. Die Tabelle artist_events sollte zwei fremde IDs und eine zusätzliche Spaltenposition haben.

Jetzt können Sie acts_as_list Methoden (auf ArtistEvent Modell, leider) verwenden, aber so etwas wie

Artist.find (: id) .events

sollten Sie eine Liste der Ereignisse geben, die zu bestimmten Künstler in der richtigen Auftrag.

+0

Mein einziges Problem mit der Annahme dieser Antwort ist, dass ich has_and_belongs_to_many benutze und kein Modell habe. Ist dieser Code gleichwertig? – mculp

+3

has_and_belongs_to_many wird von vielen als veraltet angesehen.Join Model-Lösung bietet Ihnen die gleiche Funktionalität wie die Methode von istm, ist aber viel flexibler. –

+0

Siehe Tricia's Update unten. Sie müssen ein: primary der Zwischentabelle hinzufügen, damit dies funktioniert. – Wilhelm

1

ich mit sich selbst verweis versuchen, wie die

class Product < ActiveRecord::Base 
    has_many :cross_sales 
    has_many :cross_sales_products, :through => :cross_sales, :order => 'cross_sales.position' 
end 

class CrossSale < ActiveRecord::Base 
    default_scope :order => 'cross_sales.position' 
    belongs_to :product 
    belongs_to :cross_sales_product, :class_name => "Product" 
    acts_as_list :scope => :product 
end 

create_table :cross_sales, :force => true, :id => false do |t| 
    t.integer :product_id, :cross_sales_product_id, :position 
end 

Aber das Feld cross_sales.position wird nie aktualisiert ...

Eine Idee?

Update: Ok das Feld 'id' ist notwendig im Falle eines zusätzlichen Modells mit has_many: through Option. Es funktioniert gut jetzt

0

In der angenommenen Antwort, beachten Sie, dass :order => 'artist_events.position' bezieht sich auf die Tabelle artist_events und nicht das Modell.

Ich lief in diesen kleinen Schluckauf beim Wechsel von einer habtm Assoziation zu has_many :through.

Verwandte Themen