Ruby on Rails:使用选项定义方法

sjs*_*jsc 3 ruby ruby-on-rails

我想定义一个让我传递选项的方法; 就像是:

@user.tasks(:completed => true)
Run Code Online (Sandbox Code Playgroud)

我认为这样的东西可以在我的用户模型中工作(但事实并非如此):

User.rb模型

  def tasks(options)
    tasks.find(:all, options)
  end
Run Code Online (Sandbox Code Playgroud)

如何正确定义方法让我使用@ user.tasks(:completed => true)?

mar*_*cgg 6

这基本上就是我这样做的:

def tasks(options={})
  unless options[:something].blank? 
    # do stuff
  end
end
Run Code Online (Sandbox Code Playgroud)

有一些不同的方法可以传递选项,但你明确地希望传递一个带有默认值的哈希值(这样你就可以调用没有选项的方法).

在您的情况下,以下内容应该解决您想要做的事情:

def tasks(options={})
  Task.find(:all, options[:conditions])
end
Run Code Online (Sandbox Code Playgroud)

编辑:然后调用它 @thing.tasks( {:conditions => "blah"} )

我没有测试,但应该没问题

编辑2:但像EmFi说这样做并不是最佳选择.请考虑使用关联.你可以去@thing.tasks.find(:all, :conditions => {blah})


Jor*_*ing 5

用户有has_many :tasks关联吗?这似乎就是你在这里所追求的.在这种情况下,Rails为您提供了查找器,您可以像这样访问:

@user.tasks.find :all, :conditions => { :completed => true }
Run Code Online (Sandbox Code Playgroud)

甚至更短:

@user.tasks.all :conditions => { :completed => true }
Run Code Online (Sandbox Code Playgroud)

如果这不够简洁并且您总是想要使用特定条件,请尝试命名范围:

# In your Task model:    
named_scope :completed, :conditions => { :completed => true }

# Then you can just call...
@some_user.tasks.completed # => Only completed Tasks for @some_user
Run Code Online (Sandbox Code Playgroud)