使用复数模型名称调用Ruby类方法

时间:2014-07-20 20:14:07

标签: ruby-on-rails ruby

class Recipe < ActiveRecord::Base

  def self.by_title_and_description(title, description)
    #logic for method redacted
  end

end

为了称呼这种方法:

Recipe.by_title_and_description(title, description) 

但是我想知道是否有办法这样做,因为我的方法返回多个实例。

Recipes.by_title_and_description(title, description)

因为它看起来更直观。 没什么大不了的,但我只是好奇。

3 个答案:

答案 0 :(得分:3)

如果你真的敢用这种风格的Rails编程,你可以写

Recipes = Recipe

定义了Recipe类的另一个常量名称。

答案 1 :(得分:1)

它违反了Rails模型命名约定。 使用finder方法的常见情况是复数(或不)变量名。 这样的事情。

@recipes = Recipe.mutliple_by_title_and_description(title, description) # return multiple instances
@recipe = Recipe.by_title_and_description(title, description) # return one instance

我不喜欢这种编程风格,但你可以继承类来做它。

class Recipes
  def self.by_title_and_description(title, description)
    # logic to return multiple instances 
  end
end

class Recipe < Recipes
  def self.by_title_and_description(title, description)
    super.first # this will return first instance from parent method
  end
end

至于我,它使代码的可读性更低,更“臭”。

答案 2 :(得分:0)

一种方法是:

class Recipes < Recipe
end
Recipes.by_title_and_description(title, description)

这使得它毫无用处。

更多方法:

define_method("Recipes") do
  Recipe
end

instance_eval('self.Recipes.by_title_and_description("title", "description")')
send("Recipes").by_title_and_description("title", "description")

当然不会使用其中任何一种,但我发现所有这些都非常有趣。