Ruby / Rails: возможно ли выполнить метод по умолчанию при вызове экземпляра (@instance == @ instance.all, если «все» является методом по умолчанию)? - PullRequest
2 голосов
/ 21 октября 2010

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

Я использую жидкие шаблоны, чтобы пользователи могли создавать динамические страницы на моем сайте. А для тех, кто не знает, 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

Ответы [ 2 ]

1 голос
/ 21 октября 2010

Это не совсем возможно.Когда вы пишете @instance, вы на самом деле не вызываете экземпляр , как вы описываете, вы получаете ссылку на объект, на который ссылается @instance.

Причина, по которой это кажетсяРабота с коллекциями для ассоциаций Rails заключается в том, что объекты ассоциаций являются экземплярами Array, у которых некоторые методы переопределены.

Я бы рассмотрел удаление PagesDrop и использование синтаксиса group_by(&:method)если вы хотите краткий способ выразить группировки.Если вы хотите сохранить его, вы можете получить какой-то путь к тому, что вы хотите, внедрив each и [] в PagesDrop и передав их в @pages.Это позволит вам использовать @page_drop.children в for циклах, например.

0 голосов
/ 21 октября 2010

Похоже, вы хотите реализовать has_many вне rails. Будет ли работать следующая?

class PageDrop < Liquid::Drop
  attr_accessor :children
  def initialize(page)
    @page = page
    @children = []
  end

  def name
    @page.name
  end
end

Это позволяет вам делать следующее:

@page_drop = PageDrop.new(@page)
@page_drop.children.size # => 0
@page_drop.children # => []

Это также дает вам все стандартные функции массива (group_by, size, each и т. Д.). Если вы хотите добавить свои собственные методы, создайте класс, который наследуется от Array, и добавьте туда свои методы.

class PageArray < Array
   def my_method
     self.each{|a| puts a}
   end
end

class PageDrop < Liquid::Drop
  attr_accessor :children
  def initialize(page)
    @page = page
    @children = PageArray.new
  end
  [...]
end

@page_drop = PageDrop.new(@page)
@page_drop.children.size # => 0
@page_drop.children # => []
@page_drop.children.my_method # Prints all the children

Тогда все функции, которые вы не определили в PageArray, попадают в методы Ruby Array.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...