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.

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


comment
Не могли бы Вы уточнить? Чего именно вы пытаетесь достичь? Также было бы неплохо дать ссылку на плагин, который вы нашли.   -  person EmFi    schedule 16.02.2010
comment
При поиске плагина я нашел более новый, который я мог бы использовать: github.com/SFEley/habtm_list. Я пытаюсь выполнить заказ артистов на мероприятиях — допустим, вы идете на концерт с хедлайнером и двумя разогревателями. Я бы хотел, чтобы он показывал порядок, в котором играют артисты.   -  person mculp    schedule 16.02.2010


Ответы (4)


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

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

Вот мое решение. Я пишу этот код из головы, но подобное решение работает в моем случае. Я почти уверен, что есть возможности для улучшения.

Я использую плагин 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 и дополнительный столбец — position.

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

Artist.find(:id).events

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

person Community    schedule 16.02.2010
comment
Моя единственная проблема с принятием этого ответа заключается в том, что я использую :has_and_belongs_to_many и у меня нет модели. Является ли этот код эквивалентным? - person mculp; 17.02.2010
comment
has_and_belongs_to_many многими считается устаревшим. Решение модели соединения дает вам ту же функциональность, что и метод habtm, но гораздо более гибкое. - person ; 18.02.2010
comment
См. обновление Триши ниже. Вы должны добавить :primary в промежуточную таблицу, чтобы это работало. - person Wilhelm; 17.02.2012

Дополнительное обновление для принятого ответа: для 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
person Roel4811    schedule 08.06.2019

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

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. Сейчас хорошо работает

person Tricia McMillan    schedule 31.03.2010

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

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

person Kurt Mueller    schedule 12.07.2013