В моей модели Post.rb я имею default_scope :conditions => {:deleted => 'false'}
Но если я пытаюсь работать Post.find(:all, :conditions => "deleted='false'")
, это ничего не возвратит. Это - как будто default_scope имеет приоритет по всему.
Я хочу это так, чтобы, когда я делаю Post.find()
это не возвращает удаленные сообщения, но я также хотел бы иметь возможность получить доступ к ним, если я должен. Какие потребности быть измененным или в моем запросе или в моей модели Rails?
Спасибо.
с_exclubier_scope
, поэтому вы должны создать класс метода:
def self.include_deleted_in
Event.with_exclusive_scope { yield }
end
затем в вашем контроллере
Post.include_deleted_in { Post.find(:all) }
Использование с_exclusive_scope
Post.with_exclusive_scope { Post.find(:all) }
Для простых приложений и внутренних
помощников я бы использовал статический метод. Для приложений с компонентами мне нравится 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.