2

私の質問は少し曖昧であることは理解していますが、他にどのように説明すればよいかわかりません。私は多くの場所で尋ねましたが、なぜ私がこれをしたいのか誰も理解していないようです。でもご容赦ください。なぜこんなものが欲しいのか説明します。

私はLiquidTemplatesを使用して、ユーザーが自分のサイトに動的なページを作成できるようにしています。そして、知らない人のために、LiquidはLiquidDropと呼ばれる彼らのクラスを使用して特定のアイテムをユーザーに公開します。ドロップ内の任意のメソッドは、Liquidテンプレートから呼び出すことができます。

クラスPageDrop<Liquid:: Drop
  def initialize(page)
    @page=ページ
  終わり

  def名
    @ page.name
  終わり

  defの子
    PagesDrop.new(@ page.children)
  終わり
終わり
クラスPagesDrop<Liquid:: Drop
  def initialize(pages)
    @pages=ページ
  終わり

  def group_by
    GroupByDrop.new(@pages)
  終わり

  def all
    @ 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 に答える