Я понимаю, что мой вопрос немного расплывчатый, но я не знаю, как еще его описать. Я спрашивал во многих местах, и никто, кажется, не понимает, почему я хочу это сделать. Но, пожалуйста, потерпите меня, и я объясню, почему я хочу что-то подобное.
Я использую жидкие шаблоны, чтобы пользователи могли создавать динамические страницы на моем сайте. А для тех, кто не знает, Liquid использует свой класс под названием LiquidDrop, чтобы предоставлять определенные элементы пользователю. Любой метод из выпадающего списка может быть вызван шаблоном Liquid.
class PageDrop < Liquid::Drop
def initialize(page)
@page = page
end
def name
@page.name
end
def children
PagesDrop.new(@page.children)
end
end
class PagesDrop < Liquid::Drop
def initialize(pages)
@pages = pages
end
def group_by
GroupByDrop.new(@pages)
end
def all
@pages.all
end
def size
@pages.size
end
end
Например, я хочу иметь возможность сделать это:
@page_drop = PageDrop.new(@page)
@page_drop.children # to get an array of children
вместо
@page_drop.children.all
Почему у меня выпадает страница?
Потому что я хочу иметь возможность аккуратно разделить методы, которые я могу сделать для массива страниц, и методы, которые я могу сделать для одной страницы. Это позволяет мне группировать страницы примерно так:
@page_drop.children.group_by.some_method_here_that_the_group_drop_contains
Чтобы сделать это проще для моих пользователей, я не хочу, чтобы им приходилось думать о добавлении «всех» или не добавлении экземпляра для отбрасывания, чтобы получить объекты «по умолчанию», которые он содержит. Для повторения:
@pages_drop = PagesDrop.new(Page.all)
@pages_drop == @pages_drop.pages #I want this to be true, as well as
@pages_drop == @pages_drop.all
Откуда я взял эту идею?
В Rails область (объект ассоциации) (@ person.friends), кажется, возвращает массив, когда вы делаете с ним определенные вещи: @ person.friends.each, для person в @ person.friends