acts_as_list с has_and_belongs_to_many отношениями

Я нашел старый плагин названным acts_as_habtm_list - но это для направляющих 1.0.0.

Эта функциональность создается в acts_as_list теперь? Я, может казаться, не нахожу информации о нем.

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

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

10
задан mculp 16 February 2010 в 17:35
поделиться

2 ответа

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

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

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

Я использую плагин rails plays_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 должно быть два внешних идентификатора и дополнительный столбец - position.

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

Artist.find (: id) .events

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

22
ответ дан 3 December 2019 в 17:20
поделиться

Я пытался использовать самообучение таким образом

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. Теперь он работает хорошо

1
ответ дан 3 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: