act_as_list с отношениями has_and_belongs_to_many - PullRequest
10 голосов
/ 16 февраля 2010

Я нашел старый плагин с именем act_as_habtm_list - но он для Rails 1.0.0.

Встроена ли эта функция в activ_as_list? Я не могу найти информацию об этом.

По сути, у меня есть таблица artist_events - нет модели. Отношения обрабатываются через две указанные модели: has_and_belongs_to_many

Как мне указать порядок в этой ситуации?

Ответы [ 4 ]

22 голосов
/ 16 февраля 2010

Я предполагаю, что у вас есть две модели - Artist и Event.

Вы хотите иметь отношения 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 должна иметь два внешних идентификатора и дополнительный столбец - положение.

Теперь вы можете использовать методы acts_as_list (к сожалению, в модели ArtistEvent), но что-то вроде

Artist.find (: идентификатор) .events

должен предоставить вам список событий, принадлежащих конкретному исполнителю в правильном порядке.

1 голос
/ 01 апреля 2010

Я пытаюсь ссылаться на себя так

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 голосов
/ 08 июня 2019

Дополнительное обновление для исключенного ответа: для 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
0 голосов
/ 13 июля 2013

В принятом ответе обратите внимание, что :order => 'artist_events.position' ссылается на таблицу artist_events, а не на модель.

Я столкнулся с этим незначительным отклонением при переходе от ассоциации habtm к has_many :through.

...