当属性为零时,如何使用动态查找器避免使用nil?

时间:2011-01-20 23:48:15

标签: ruby-on-rails activerecord dynamic-finders

link_to 'articles', articles_path, :attr1 => 'foo', :attr2 => 'bar' 

在控制器中:

Article.find_all_by_attr1_and_attr2(params[:attr1], params[:attr2])

但是,如果控制器仅收到[:attr1],我会收到零。

1 个答案:

答案 0 :(得分:2)

如果某些发现者实际上并不存在,动态查找器可能不是正确的方法。在这种情况下,您最好在Rails 2上使用Article.find(:all, :conditions => {}),在Rails 3上使用Article.where()

这是我在一段时间内提出的另一个问题的方法:

conditions = [:attr1, :attr2].inject({}) do |hsh, field|
  hsh[field] = params[field] if params[field] && params[field].present?
  hsh
end

# Rails 2
@articles = Article.find(:all, :conditions => conditions)

# Rails 3
@articles = Article.where(conditions)

在上面的例子中,你将循环遍历数组中的所有字段,并将它们中的每一个添加到生成的哈希中(如果它在params中而不是空)。然后,你将哈希传递给finder,一切都很好,花花公子。