Act_as_list с has_and_belongs_to_many отношения
Я нашел старый плагин с именем act_as_habtm_list - но он для Rails 1.0.0.
Эта функция теперь встроена в act_as_list? Я не могу найти никакой информации об этом.
В принципе, у меня есть таблица artist_events - нет модели. Связь выполняется с помощью этих двух моделей с указанием: has_and_belongs_to_many
Как я могу указать порядок в этой ситуации?
Ответы
Ответ 1
Я предполагаю, что у вас есть две модели - Artist и Event.
Вы хотите иметь отношение habtm между ними, и вы хотите определить порядок событий для каждого исполнителя.
Вот мое решение. Я пишу этот код со своей головы, но подобное решение работает в моем случае. Я уверен, что есть место для улучшения.
Я использую плагин rails actions_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 должна иметь две внешние идентификаторы и дополнительную позицию столбца.
Теперь вы можете использовать методы act_as_list (например, по модели ArtistEvent), но что-то вроде
Artist.find(: ИД).events
должен предоставить вам список событий, принадлежащих определенному художнику, в правильном порядке.
Ответ 2
Я пытаюсь с помощью саморегуляции, как это
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 никогда не обновляется...
Идея?
Обновление: Ok поле "id" необходимо в случае дополнительной модели с параметром has_many: через. Он хорошо работает сейчас
Ответ 3
В принятом ответе обратите внимание, что :order => 'artist_events.position'
ссылается на таблицу artist_events
, а не на модель.
Я столкнулся с этой незначительной икотой при переходе от ассоциации habtm
к has_many :through
.
Ответ 4
Дополнительное обновление для исключенного ответа: для 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