Условно активируйте "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, что должно быть распространено.