Rails 2.3: как превратить этот оператор SQL в named_scope - PullRequest
3 голосов
/ 30 мая 2010

Имея небольшую сложность в выяснении, как создать named_scope из этого SQL-запроса:

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

Категория должна изменяться для изменения.

Как наиболее эффективным способом можно написать named_scope для указанной выше проблемы?

Ответы [ 2 ]

7 голосов
/ 30 мая 2010
  named_scope :scope_name, lambda { |category|
    { 
      :conditions => ["id NOT IN (select foo_id from bar) AND foo.category = ?", category],
      :order => 'RAND()',
      :limit => 1
    }
  }
4 голосов
/ 30 мая 2010

Больше комментариев, чем ответа, но он не очень подходит ...

zed_oxff на мяче.

Чтобы упростить вещи и сохранить их СУХИЕ, вы можете рассмотреть определение отдельных именованных областей вместо одной большой и объединить их в цепочку.

Например:

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

Таким образом, вы бы использовали их следующим образом:

Person.random_order.limit(3).whatever
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...