Использование act_as_list для нескольких столбцов

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

class Book
  acts_as_list :column => :genre, :scope => :genre
  acts_as_list :column => :author, :scope => :author
  belongs_to :genre
  belongs_to :author
end

Итак, в основном то, что я пытаюсь сделать, это иметь модель книги, которая является частью двух списков: один для страницы жанра, на которой он появляется, и один для страницы автора, на которой он появляется.

acts_as_list, по-видимому, не поддерживает использование столбцов с двумя позициями, поскольку такие методы, как move_to_top, не позволяют указать, какой список следует переместить в начало.

Кто-нибудь получил какие-либо предложения о том, как я мог бы достичь этого? Прямо сейчас я думаю, что мне придется создать таблицу соединений, такую ​​​​как books_genres, которая имеет столбец position, но я действительно не слишком заинтересован в этом, поскольку для этого требуется целая куча дополнительных таблиц.


person Matthew O'Riordan    schedule 22.10.2011    source источник
comment
Вы когда-нибудь разбирали это? Я начал щедрость, так как мне нужно то же решение   -  person jamesc    schedule 12.01.2012
comment
К сожалению, нет, не смог найти решение, но не возражал бы против этой награды!   -  person Matthew O'Riordan    schedule 12.01.2012
comment
Я ищу точно такую ​​же функцию...   -  person gkpo    schedule 06.10.2014
comment
Та же проблема, спустя 5 лет. Я, вероятно, буду использовать ranked-model.   -  person Wilson Silva    schedule 08.12.2016
comment
На самом деле, это теперь решено с 0.7.6   -  person Brian Sigafoos    schedule 30.06.2017


Ответы (3)


Старый пост, но я надеюсь, что это поможет. Это работает как минимум с act_as_list 0.7.6...

Добавьте свою область в массив и используйте идентификаторы в качестве параметров...

belongs_to :website
belongs_to :page    
acts_as_list scope: [:website_id, :page_id]
person dsmithco    schedule 29.07.2016

Действует как список, не предназначенный для нескольких столбцов. Плагин будет почти переписан, если вы захотите использовать его таким образом. Но я думаю, вы можете попробовать сделать это.

class Book
  belongs_to :genre
  belongs_to :author
end

class GenreBook < Book
  acts_as_list :column => :genre, :scope => :genre
end

class AuthorBook < Book
  acts_as_list :column => :author, :scope => :author
end

не уверен, что это работает. теоретически возможно.

person Ankun    schedule 12.01.2012
comment
Это работает, если вам нужен только один вид заказа при загрузке коллекции книг. - person suweller; 16.01.2012

Попробуйте другую жемчужину под названием ranked-model. Он поддерживает случай, о котором вы упомянули, указав параметр :with_same. Я пробовал это сам.

Для вашего примера вы можете сделать:

class Book
    belongs_to :genre
    belongs_to :author

    ranks :within_genre,
      :with_same => :genre_id,
      :column => :genre

    ranks :within_author,
      :with_same => :author_id,
      :column => :author
end
person nnattawat    schedule 06.10.2014