10

我發現了一個名爲acts_as_habtm_list的舊插件 - 但它適用於Rails 1.0.0。acts_as_list與has_and_belongs_to_many的關係

現在這個功能是否構建在acts_as_list中?我似乎無法找到任何信息。

基本上,我有一個artists_events表 - 沒有模型。通過以下兩種模式處理關係:has_and_belongs_to_many

如何在此情況下指定順序?

+0

你能更具體嗎?你究竟想達到什麼目的?另外一個鏈接到你找到的插件會很好。 – EmFi

+0

在尋找插件時,我找到了一個可以使用的新插件:http://github.com/SFEley/habtm_list 我正在嘗試完成藝術家在活動中的順序 - 假設您前往與頂棚和兩個開瓶器的音樂會。我想讓它顯示藝術家在玩的順序。 – mculp

回答

22

我假設你有兩個模型 - 藝術家和事件。

你想要在他們之間有一個habtm關係,並且你希望能夠爲每個藝術家定義事件的順序。

這是我的解決方案。我從頭上寫這個​​代碼,但類似的解決方案適用於我的情況。我很確定有一個改進的餘地。

我正在使用rails acts_as_list插件。

這就是我將如何定義模型:

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 

正如你看到的,你需要一個額外的模型ArtistEvent,加入了另外兩個。 artist_events表應該有兩個外部ID和額外的列位置。

現在你可以使用acts_as_list方法(上ArtistEvent模型,遺憾的是),但像

Artist.find(:ID).events

應該給你屬於特定藝術家在正確的事件列表訂購。

+0

接受這個答案的唯一方法就是我使用:has_and_belongs_to_many,我沒有模型。這個代碼是否等價? – mculp

+3

has_and_belongs_to_many被​​許多人認爲已被棄用。加入模型解決方案爲您提供與habtm方法相同的功能,但更加靈活。 – 2010-02-18 10:53:03

+0

請參閱下面的Tricia更新。你必須在中間表中添加一個:primary來使其工作。 – Wilhelm

1

我與自我參照這樣的

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 

但場cross_sales.position從不更新嘗試...

的想法?

更新:好的字段'id'在has_many:through選項的附加模型的情況下是必需的。現在工作很好

0

在接受的答案中,請注意:order => 'artist_events.position'引用表artist_events而不是模型。

habtm協會移動到has_many :through時,我遇到了這個小呃逆。

相關問題