Find返回枚举器,而不是对象

时间:2011-06-18 17:55:05

标签: ruby-on-rails ruby-on-rails-3 activerecord find enumerator

我正在开发一个Rails 3应用程序,我的控制器中有一行显示如下:

@features = Feature.find(:all, :conditions => ['featured_at < ?', Time.current], :order => 'featured_at ASC')
@feature = @features.find(params[:feature])

我们的想法是从数据库中获取一组“功能”,但要受到一些限制,然后从该组中特别挑出一个。如果有问题的记录存在于DB中但不符合约束,我不想返回它。因此,我正在@features.find而不是Feature.find

我遇到的问题是视图需要@feature.title,这会产生错误:

undefined method 'title' for #<Enumerator:0x0000010216efd8>

当然,我可以通过用以下方法替换上面的问题来回避问题,我只是简单地定义了两次约束:

@features = Feature.find(:all, :conditions => ['featured_at < ?', Time.current], :order => 'featured_at ASC')
@feature = Feature.find(params[:feature], :conditions => ['featured_at < ?', Time.current], :order => 'featured_at ASC')

但这似乎不够优雅而且有点多余。

什么是最好的解决方案?如何将@features.find结果视为Feature,而不是缺少我需要在视图中访问的变量/方法的Enumerator

感谢您对此的任何想法。

1 个答案:

答案 0 :(得分:1)

我建议:

@features = Feature.where('featured_at < ?', Time.now).order('featured_at ASC')
@feature = @features.find(feature_id)

其中feature_id是要从集合中提取的id(或id列表)。只有第二行会命中数据库。问题是:all选项强制该方法发送查询并返回一个数组。