using lambda in find in rails

≡放荡痞女 提交于 2019-12-10 22:26:05

问题


I have a method that does a paginated find call like..

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)

When this call runs it simply ignores the conditions in the generated query.

2

If I try it in a named_scope I get an error like..

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}}

The named-scope error :

/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'

For #1. What am I doing wrong, why is it ignoring the conditions?

For #2 Why this error? And also, how can I pass the :page and per_page parameter to limit the query in the named_scope.

Thanks


回答1:


Your use case does not warrant a named_scope. You can write a regular finder as follows:

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)

The paginate method is equivalent to all, so you don't have to supply the :all result-set scope qualifier to the paginate method.

The time value is calculated upon the execution of the query. This is unlike a named_scope, where you have to use a lambda for the same effect.

If you need to use the named_scope then do the following:

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'
               }}

Now you can use the named_scope as follows

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



回答2:


Your named scope is missing a : before your order key. That might be blowing up the named scope. Otherwise, it looks fine.

That said, you don't need to use a lambda to get records relevant to the current time. Your database provides methods that do similar. For example, if you are using MySQL, you can use:

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() is a MySQL-specific function that returns the current date and time in UTC (which Rails should be storing your DateTimes as already).



来源:https://stackoverflow.com/questions/3488534/using-lambda-in-find-in-rails

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!