11

我找到了一个名为acts_as_habtm_list 的旧插件——但它适用于Rails 1.0.0。

现在这个功能是内置在acts_as_list 中的吗?我似乎找不到任何关于它的信息。

基本上,我有一个 Artists_events 表 - 没有模型。这种关系是通过指定 :has_and_belongs_to_many 的这两个模型来处理的

在这种情况下如何指定顺序?

4

4 回答 4

23

我假设你有两个模型——艺术家和事件。

您希望在它们之间建立一种习惯关系,并且您希望能够为每个艺术家定义事件的顺序。

这是我的解决方案。我正在从头开始编写此代码,但类似的解决方案适用于我的情况。我很确定还有改进的余地。

我正在使用 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

应该以正确的顺序为您提供属于特定艺术家的事件列表。

于 2010-02-16T20:48:51.697 回答
2

已接受答案的附加更新:对于 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
于 2019-06-08T14:58:08.833 回答
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 选项的附加模型的情况下是必要的。现在运行良好

于 2010-03-31T20:18:55.923 回答
0

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

当我从一个habtm协会转移到has_many :through.

于 2013-07-12T23:40:01.057 回答