Rails 3 получают sql из области видимости - PullRequest
3 голосов
/ 27 апреля 2011

Есть ли способ получить sql для просто области?Поэтому я хочу сделать что-то вроде:

   class Presentation < ActiveRecord::Base
      has_many :calls
      has_many :recordings, :through => :calls

      scope :with_recordings, joins(:calls).joins(:recordings)
   end

И затем иметь возможность получить sql для этой области.

Presentations.with_recordings.sql возвращает весь оператор SQL, включая оператор SELECT,Все, что я хочу, - это SQL, добавленный областью действия.Подумайте, должен быть способ сделать это.

Ответы [ 2 ]

3 голосов
/ 19 октября 2011

Я согласен с ctcherry, что это не очень полезно, но, сказав это, мне нужно было сделать это для проекта, над которым я работал. Нам нужно было продублировать sql в областях, чтобы мы могли повторно использовать sql для разных типов поиска. Вместо того, чтобы поддерживать одинаковый sql в двух разных местах, я выбираю извлечение sql из области видимости.

Код ниже - это то, что я придумал. Это некрасиво, но работает под Rails 3.0

  def extract_named_scope_clause(scope, args)
    # where_clauses will return an array of clauses for an entire relationship.
    # As this is only run a single scope, we only ever care about the first.....
    clause, *bind_vars = self.send(scope, args).where_clauses.first
    # prefix 'and ' to the string, add some spaces and append any bind variables
    if clause
      [" and #{clause} ", bind_vars]
    else
      nil
    end
  end
0 голосов
/ 27 апреля 2011

Это не имеет смысла, поскольку не существует стандартного способа представления «фрагментов» SQL.

Различные виды «фрагментов» SQL, которые могут быть добавлены и обработаны областью действия, на самом деле не имеют чистого способа быть представленными сами по себе, не будучи частью полного оператора SQL. Фрагмент может быть «ПРИСОЕДИНЯЙТЕСЬ к пользователям ПО users.id = orders.user_id» или «WHERE active = 1». Как бы вы вернули их без того, чтобы они были частью полного оператора SQL? Скорее всего, именно поэтому нет механизма для их извлечения, кроме того, который вы уже обнаружили, который просто возвращает полный оператор SQL.

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