在rails中使用lambda

我有一个方法,可以执行分页查找调用,如…

1

coll = paginate(:all, lambda {{:conditions => ['status = ? AND expires  Constants::POST_FIELDS, :order => 'posts.ratings DESC', :include => [{:poster => :poster_friends}, :category], :per_page => Constants::LISTINGS_PER_PAGE, :page => page) 

当此调用运行时,它只是忽略生成的查询中的条件。

2

如果我在named_scope中尝试它,我会得到一个错误,如…

 named_scope :featured_all, lambda {{:conditions => ['status = ? AND expires  'posts.ratings DESC', :include => [{:poster => :poster_friends}, :category], :select => Constants::POST_FIELDS}} 

命名范围错误:

 /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/core_ext/hash/keys.rb:47:in `assert_valid_keys' /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2101:in `with_scope' /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/named_scope.rb:113:in `__send__' /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/named_scope.rb:113:in `with_scope' /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/named_scope.rb:174:in `method_missing' /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/named_scope.rb:188:in `load_found' /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/named_scope.rb:166:in `proxy_found' /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/named_scope.rb:109:in `is_a?' /usr/lib/ruby/gems/1.8/gems/hirb-0.3.1/lib/hirb/formatter.rb:78:in `determine_output_class' /usr/lib/ruby/gems/1.8/gems/hirb-0.3.1/lib/hirb/formatter.rb:48:in `format_output' /usr/lib/ruby/gems/1.8/gems/hirb-0.3.1/lib/hirb/view.rb:213:in `render_output' /usr/lib/ruby/gems/1.8/gems/hirb-0.3.1/lib/hirb/view.rb:126:in `view_output' 

对于#1。 我做错了什么,为什么忽视条件?

对于#2为什么会出现此错误? 而且,我如何传递:page和per_page参数来限制named_scope中的查询。

谢谢

您的用例不保证named_scope。 您可以按如下方式编写常规查找器:

 coll = paginate(:select => Constants::POST_FIELDS, :conditions => ['status = ? AND expires < ?', 'a', DateTime.now], :include => [{:poster => :poster_friends}, :category], :order => 'posts.ratings DESC', :per_page => Constants::LISTINGS_PER_PAGE, :page => page) 

paginate方法等同于all ,因此您不必将:all result-set scope限定符提供给paginate方法。

在执行查询时计算时间值。 这与named_scope不同,您必须使用lambda来获得相同的效果。

如果需要使用named_scope,请执行以下操作:

 named_scope :featured_all, lambda {{ :select => Constants::POST_FIELDS, :conditions => ['status = ? AND expires < ?', 'a', DateTime.now], :include => [{:poster => :poster_friends}, :category], :order => 'posts.ratings DESC' }} 

现在您可以使用named_scope,如下所示

 Post.feature_all.paginate(:per_page => Constants::LISTINGS_PER_PAGE, :page => page) 

您的命名范围缺少a :在您的订单密钥之前。 这可能会炸毁命名的范围。 否则,它看起来很好。

也就是说,您不需要使用lambda来获取与当前时间相关的记录。 您的数据库提供了类似的方法。 例如,如果您使用的是MySQL,则可以使用:

 named_scope(:featured_all, { :conditions => "status = 'a' AND expires < UTC_TIMESTAMP()", :order => 'posts.ratings DESC', :include => [{:poster => :poster_friends}, :category], :select => Constants::POST_FIELDS }) 

UTC_TIMESTAMP()是一个特定于MySQL的函数,它以UTC UTC_TIMESTAMP()返回当前日期和时间(Rails应该存储您的DateTimes)。