Условно активируйте "activ_on_list", когда поле определено

У меня есть модель "запись", и мне нужно, чтобы она действовала как список, когда playlist_id указано, но если это не так, мне нужно, чтобы он не действовал как список. (act_as_list - это драгоценный камень, который я использую)

В моем коде модели у меня есть:

acts_as_list scope: :playlist

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

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

1 ответ

Мое поверхностное понимание - модельная проекция может нуждаться в улучшении. В моем понимании act_as_list лучше для has_many - belongs_to отношения, скажем, todo именно в списке Todo.

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

Я думаю, что вам нужна промежуточная модель, скажем ListItem представлять такие отношения

class PlayList < ActiveRecord::Base
  has_many :list_items
  has_many :entries, through: :list_items
end

class ListItem < ActiveRecord::Base
  belongs_to :play_list
  belongs_to :entires
  acts_as_list scope: :play_list
end

class Entries < ActiveRecord::Base
  has_many :list_items
  has_many :play_lists, through: :list_items

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

Другие вопросы по тегам