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)?
这基本上就是我这样做的:
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})
用户有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)
归档时间: |
|
查看次数: |
5458 次 |
最近记录: |