在ActiveRecord关系上定义自定义查找程序方法?

时间:2011-08-13 21:58:42

标签: ruby-on-rails ruby activerecord

Foo has_many Bar。我想做点什么:

foo_instance.bars.find_with_custom_stuff(baz)

如何定义find_with_custom_stuff,使其在bars关系中可用? (而不仅仅是Bar类方法?)

更新

我想做一些比范围更复杂的事情。类似的东西:

def find_with_custom_stuff(thing)
  if relation.find_by_pineapple(thing)
    relation.find_by_pineapple(thing).monkey
  else
    :banana
  end
end

1 个答案:

答案 0 :(得分:5)

范围,导轨3中的scope和导轨2中的named_scope

class Bar
  scope :custom_find, lambda {|baz| where(:whatever => baz) }
end

foo_instance.bars.custom_find(baz)

scope应该返回一个范围,因此在您提供更新时,您可能不希望在此处使用scope。您可以编写类方法,并使用scoped访问当前范围,例如:

class Bar
  def self.custom_find(thing)
    if bar = scoped.find_by_pineapple(thing)
      bar.monkey
    else
      :banana
    end
  end
end