使用Mongoid Rails和Ruby的记录委托

时间:2014-02-01 20:44:29

标签: ruby-on-rails ruby mongoid delegation

我正在使用ruby 2,rails 4和mongoid-rails gem

我有两种模式:

class Product
  embeds_one :feature
end

class Feature
  embedded_in :product

  field :color, type: String
end

假设我有一个产品:

p = Product.new

我希望能够打电话:

p.color = "blue"

而不是必须:

p.feature.color = "blue"

调用属性也是如此:

p.color
=> "blue"

VS。不太理想(和现状)

p.feature.color
=> "blue"

我知道有活动记录你可以使用委托,但我如何在mongoid中设置它而不必用大量参考特征模型的方法来填充我的模型?

1 个答案:

答案 0 :(得分:6)

delegate方法不仅限于Active记录 - 它附带Active Support,可以在任何类上使用,以将任何方法委托给任何内部对象:

require 'active_support/all'
class A
  def initialize(a)
    @a = a
  end
  delegate :+, to: :@a
end

A.new(2) + 4     #=> 6

因此您也可以将它用于您的模型。只需记住添加allow_nil: true,这样如果它没有任何功能,它就不会抛出异常。

class Product
  embeds_one :feature

  delegate :color, to: :feature, allow_nil: true
end