2

我有一种方法可以进行分页查找调用,例如..

1

coll = paginate(:all, lambda {{:conditions => ['status = ? AND expires < ?', 'a', DateTime.now]}}, :select => 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 < ?', 'a', DateTime.now], order => '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 中的查询。

谢谢

4

2 回答 2

1

您的用例不保证 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为该方法提供结果集范围限定符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)
于 2010-08-15T22:33:57.090 回答
0

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

也就是说,您不需要使用 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 格式返回当前日期和时间(Rails 应该已经存储了您的 DateTimes)。

于 2010-08-15T19:50:17.547 回答