Rails 2.3:如何将此SQL语句转换为named_scope

时间:2010-05-30 04:28:46

标签: ruby-on-rails ruby activerecord

在确定如何从此SQL查询中创建named_scope时遇到一些困难:

select * from foo where id NOT IN (select foo_id from bar) AND foo.category = ? ORDER BY RAND() LIMIT 1;

类别应该是变量才能改变。

为上述问题编写named_scope的最有效方法是什么?

2 个答案:

答案 0 :(得分:7)

  named_scope :scope_name, lambda { |category|
    { 
      :conditions => ["id NOT IN (select foo_id from bar) AND foo.category = ?", category],
      :order => 'RAND()',
      :limit => 1
    }
  }

答案 1 :(得分:4)

更多的评论而不是答案,但它不适合......

zed_oxff在球上。

为了简化并保持干燥,您可以考虑定义离散的命名范围而不是一个大范围,并将它们链接在一起。

例如:

named_scope :random_order, :order => 'RAND()'
named_scope :limit, :lambda => { |limit| :limit => limit }
named_scope :whatever, ...

所以你会按如下方式使用它们:

Person.random_order.limit(3).whatever