Переопределение default_scope в направляющих

В моей модели Post.rb я имею default_scope :conditions => {:deleted => 'false'}

Но если я пытаюсь работать Post.find(:all, :conditions => "deleted='false'"), это ничего не возвратит. Это - как будто default_scope имеет приоритет по всему.

Я хочу это так, чтобы, когда я делаю Post.find() это не возвращает удаленные сообщения, но я также хотел бы иметь возможность получить доступ к ним, если я должен. Какие потребности быть измененным или в моем запросе или в моей модели Rails?

Спасибо.

19
задан John Topley 15 January 2010 в 18:34
поделиться

3 ответа

с_exclubier_scope , поэтому вы должны создать класс метода:

def self.include_deleted_in
  Event.with_exclusive_scope { yield }
end

затем в вашем контроллере

Post.include_deleted_in { Post.find(:all) }
17
ответ дан 30 November 2019 в 01:54
поделиться

Использование с_exclusive_scope

 Post.with_exclusive_scope { Post.find(:all) }
1
ответ дан 30 November 2019 в 01:54
поделиться

Для простых приложений и внутренних помощников я бы использовал статический метод. Для приложений с компонентами мне нравится Managed Extensiability Framework . Вот отрывок из документа, который я пишу, чтобы описать узоры, которые вы найдете в моих API.

  • Услуги
    • Определяется интерфейсом службы I [ServiceName] .
    • Экспортировано и импортировано типом интерфейса.
    • Единая реализация обеспечивается серверным приложением и потребляется внутренними и/или внутренними расширениями.
    • Методы на сервисном интерфейсе безопасны для потоков.

В качестве надуманного примера:

public interface ISettingsService
{
    string ReadSetting(string name);

    void WriteSetting(string name, string value);
}

[Export]
public class ObjectRequiringSettings
{
    [Import]
    private ISettingsService SettingsService
    {
        get;
        set;
    }

    private void Foo()
    {
        if (SettingsService.ReadSetting("PerformFooAction") == bool.TrueString)
        {
            // whatever
        }
    }
}
-121--655919-

Поскольку все остальные уже дали ответ, я добавлю немного дополнительного контекста.% оператор «модуль» фактически делать оставшуюся операцию. Разница между мод и рем тонкая, но важная.

(-1 mod 2) обычно дает 1. Более конкретно, учитывая два целых числа, X и Y, операция (X mod Y) имеет тенденцию возвращать значение в диапазоне [0, Y). Иначе говоря, модуль X и Y всегда больше или равен нулю и меньше Y.

Выполнение одной и той же операции с оператором «%» или rem сохраняет знак значения X. Если X отрицательный, получается результат в диапазоне (-Y, 0]. Если X положителен, получается результат в диапазоне [0, Y).

Часто это тонкое различие не имеет значения. Однако, возвращаясь к вашему кодовому вопросу, есть несколько способов решения для «равномерности».

Первый подход хорош для начинающих, потому что он особенно многословен.

// Option 1: Clearest way for beginners
boolean isEven;
if ((a % 2) == 0)
{
  isEven = true
}
else
{
  isEven = false
}

Второй подход лучше использует преимущества языка и приводит к более сжатому коду. (Не забывайте, что оператор = = возвращает логическое значение.)

// Option 2: Clear, succinct, code
boolean isEven = ((a % 2) == 0);

Третий подход здесь для полноты и использует оператор ternary . Хотя троичный оператор часто очень полезен, в данном случае считаю второй подход превосходящим.

// Option 3: Ternary operator
boolean isEven = ((a % 2) == 0) ? true : false;

Четвертый и последний подход заключается в использовании знаний о двоичном представлении целых чисел . Если младший значащий бит равен 0, то число равно четному. Это можно проверить с помощью оператора bitwise-and (&). Хотя этот подход является самым быстрым (вы делаете простую битовую маскировку вместо деления), он, возможно, немного продвинутый/сложный для новичка.

// Option 4: Bitwise-and
boolean isEven = ((a & 1) == 0);

Здесь я использовал оператор bitwise-and и представил его в сжатой форме, показанной в опции 2. Переписывание его в форме Варианта 1 (и в качестве альтернативы Варианта 3) оставлено как упражнение читателю.;)

Надежда, которая поможет.

-121--595725-

Области предназначены для того, чтобы быть составными, что означает, что вы можете объединить несколько из них, и это эффективно применяет все условия. В этом случае ActiveRecord слишком наивен, чтобы определить, что явное условие должно свести на нет первое. Он просто создает запрос, объединяющий все предложения с AN. По этой причине у default_scope больше всего утилит с предложениями: order, которые не могут быть составлены (в ActiveRecord 2.Реализация 3 в любом случае). Здесь более подробно обсуждается .

Также обратите внимание, что в Rails 3 ActiveRecord использует Arel для создания большого количества запросов, что значительно увеличит мощность генерации запросов ActiveRecord, упрощая при этом большое количество внутренних элементов. Вполне вероятно, что с Арелом ваше положение улучшится. В то же время я рекомендую не ставить условия в default_scope, если нет строк, которые вы действительно хотите быть невидимыми для вашего приложения Rails.

1
ответ дан 30 November 2019 в 01:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: