我找到了一个名为acts_as_habtm_list 的旧插件——但它适用于Rails 1.0.0。
现在这个功能是内置在acts_as_list 中的吗?我似乎找不到任何关于它的信息。
基本上,我有一个 Artists_events 表 - 没有模型。这种关系是通过指定 :has_and_belongs_to_many 的这两个模型来处理的
在这种情况下如何指定顺序?
我找到了一个名为acts_as_habtm_list 的旧插件——但它适用于Rails 1.0.0。
现在这个功能是内置在acts_as_list 中的吗?我似乎找不到任何关于它的信息。
基本上,我有一个 Artists_events 表 - 没有模型。这种关系是通过指定 :has_and_belongs_to_many 的这两个模型来处理的
在这种情况下如何指定顺序?
我假设你有两个模型——艺术家和事件。
您希望在它们之间建立一种习惯关系,并且您希望能够为每个艺术家定义事件的顺序。
这是我的解决方案。我正在从头开始编写此代码,但类似的解决方案适用于我的情况。我很确定还有改进的余地。
我正在使用 rails act_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
应该以正确的顺序为您提供属于特定艺术家的事件列表。
已接受答案的附加更新:对于 Rails 4 和 Rails 5:
has_many :events, -> { order 'artist_events.position ASC' }, through: :artist_events
has_many :artists, -> { order 'artist_events.position ASC' }, through: :artist_events
我尝试这样的自我引用
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 选项的附加模型的情况下是必要的。现在运行良好
在接受的答案中,请注意:order => 'artist_events.position'
引用的是表格artist_events
而不是模型。
当我从一个habtm
协会转移到has_many :through
.