ruby-on-rails - Ruby/Rails: 在调用实例( @instance == @instance.all 如果"all" 是默认方法) 时是否有可能执行默认方法?

  显示原文与译文双语对照的内容

我理解我的问题有点模糊,但我不知道怎么描述它。 我已经在许多地方问过了,似乎没有人知道我为什么要这么做。 但是请你忍受我,我会解释为什么我想要这样的东西。

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

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

为什么我的页面被删除?

因为我希望能够干净地把我可以做的方法分解为页面的array,并且我可以在单个页面中做一些方法。 这允许我对页面进行分组:

@page_drop.children.group_by.some_method_here_that_the_group_drop_contains

,使它更简单可供用户,我做 NOT 希望他们要考虑添加"全部"或者 NOT 下降实例得到"默认值"对象/s,它包含。 重申:

@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 。friend ) 似乎返回了 array: @person.friends 中的用户 @person.friends.each.

时间: 作者:

这不是真正可能的。当你编写 @instance 时,你不是真正的调用实例,你将得到对 @instance 引用的对象的引用。

它似乎与 Rails的关联集合一起工作的原因是关联对象是 Array的实例,这些实例已经覆盖了它们的一些方法。

我将考虑删除 PagesDrop 并使用 group_by(&:method) 语法,如果你想用一种简洁的方式来表达分组。 如果你想保留它,那么你可以通过在 PagesDrop 上实现 each[],并将它们委托给 @pages 来获得一些途径。 这将允许你在 for 循环中使用 @page_drop.children,例如。

作者:

看起来你想在 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 # => []

这也给你所有的标准 array 函数( group_by,大小,每个等) 。 如果要添加自己的方法,请创建从 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 方法。

...