Вызовите функции mongoid по умолчанию - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть класс, но я хочу настроить свое поведение, если поле имеет определенное значение. В противном случае я хочу поведение по умолчанию.

class Foo
  include Mongoid::Document

  belongs_to :parent, :foreign_key => "parent_id", :class_name => "Pad"
  has_many :children, :foreign_key => "parent_id", :class_name => "Pad"
  field :bar, :type => String

  def children
    if self.bar == "some value"
      # Do something special
    else
      return self.children   # <- What goes here that isn't an infinite loop?
    end
  end
end

Какой должна быть ветвь else?

Я не хочу переопределять детей, поэтому я ищу больше, чем просто Foo.where (: parent_id => self.id)

1 Ответ

1 голос
/ 29 ноября 2011

Active Support предоставляет метод для сохранения оригинального метода в таких случаях - он называется «alias_method_chain» ... Это немного чёрной магии, но вы определяете {method}_with_{condition} и вызываете оригинал с помощью {method}_without_{condition}

В вашем случае: children_with_bar и вы получите оригинал, позвонив по номеру children_without_bar

require 'active_support'
require 'mongoid'

class Foo
  include Mongoid::Document
  has_many :children, :foreign_key => "parent_id", :class_name => "Pad"
  field :bar

  def children_with_bar
    if self.bar == "some value"
      return "yooooo"
    else
      children_without_bar
    end
  end

  alias_method_chain :children, :bar
end


Foo.new(:bar=>"some value").children
 => "yooooo" 
Foo.new(:bar=>"different").children
 ## Will run original children method
...