2

我知道我的问题有点含糊,但我不知道如何描述它。我在很多地方问过,似乎没有人明白我为什么要这样做。但请耐心等待,我会解释为什么我想要这样的东西。

我正在使用 Liquid 模板来允许用户在我的网站上创建一些动态页面。对于那些不知道的人,Liquid 使用他们的一个名为 LiquidDrop 的类来向用户公开某些项目。液滴中的任何方法都可以被 Liquid 模板调用。

类 PageDrop < Liquid::Drop
  定义初始化(页面)
    @page = 页
  结尾

  定义名称
    @page.name
  结尾

  定义儿童
    PagesDrop.new(@page.children)
  结尾
结尾
类 PagesDrop < Liquid::Drop
  定义初始化(页)
    @pages = 页
  结尾

  def group_by
    GroupByDrop.new(@pages)
  结尾

  全部定义
    @pages.all
  结尾

  默认尺寸
    @pages.size
  结尾
结尾

例如,我希望能够做到这一点:

@page_drop = PageDrop.new(@page)
@page_drop.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 #我希望这是真的,以及
@pages_drop == @pages_drop.all

我从哪里得到这个想法?

在 Rails 中,当您对范围(关联对象)(@person.friends)执行某些操作时,它似乎会返回数组:@person.friends.each,对于@person.friends 中的人

4

2 回答 2

1

这真的不可能。当您编写时,@instance您并没有真正调用您描述的实例,而是获得对所引用对象的@instance引用。

它似乎与 Rails 关联的集合一起工作的原因是关联对象是Array其某些方法被覆盖的实例。

如果您想要一种简洁的方式来表达分组,我会考虑删除PagesDrop并使用语法。group_by(&:method)如果您确实想保留它,那么您可以通过实施并each让他们委托给. 例如,这将让您在循环中使用。[]PagesDrop@pages@page_drop.childrenfor

于 2010-10-21T15:11:09.780 回答
0

看起来您想在 rails 之外实现 has_many 。下面的工作吗?

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 方法。

于 2010-10-21T16:13:38.523 回答