2013-07-29 3 views
5

У меня есть приспособление для модели «Softwareversion»:Рельсы, светильники и default_scope

testing: 
    id: 4 
    version: "4.0" 
    file_name: MyString4 
    is_testing: true 

И масштаб по умолчанию для модели:

default_scope where(is_testing: false) 

Если я делаю это в тесте:

software_versions(:testing) 

Я получаю сообщение об ошибке:

ActiveRecord::RecordNotFound: Couldn't find SoftwareVersion with id=4 [WHERE `software_versions`.`is_testing` = 0] 

Это намеренное поведение? И как мне переопределить его?

+0

Ну, в приборе yo укажите, что is_testing истинно, а модель по умолчанию - 'is_testing: false', так как можно найти запись? –

ответ

3

Да, это предназначено behavir, область по умолчанию затронет все запросы. Используйте незаданный, чтобы начать чистый запрос снова:

SoftwareVersion.unscoped.where(is_testing: true) 
SoftwareVersion.unscoped.find(id: 4) 
etc. 

Но что, кроме того, если вы используете один и тот же стол (с светильниками) для хранения как производства и тестирования записей, то вы делаете это неправильно. Rails использует совершенно другую базу данных для тестирования, поэтому вам не нужен столбец для различения. И если вы установите светильники под test/fixtures, они никогда не будут загружены в производство вообще.

+0

Ох - поле is_testing используется для определения того, является ли SoftwareVersion тестовой версией только для тестовых блоков (компьютеров) или если они готовы к использованию в производстве :-) Терминология взята из фактического производственного приложения. – jriff

+0

Ага - спасибо за разъяснение, но это был просто сидней. Отвечает ли 'unscoped' на ваш вопрос? – Subhas

+0

Он делает, и это не так. Я знал, что я могу использовать unscoped для записи. Я хотел бы иметь возможность использовать сокращенное software_versions (: testing). Чтобы код был чистым и аккуратным. Но я думаю, что это единственный способ сделать это так - да. Спасибо. – jriff

2

Поведение такое, как предполагалось, единственная проблема заключается в том, что в вашей тестовой базе данных нет записи SoftwareVersion. Перед запуском тестов вам нужно заполнить базу данных. Как вы можете видеть, запрос выполнен отлично, WHERE software_versions.is_testing = 0, с нулевыми средствами false как в вашем default_scope.

+0

Согласен, что очевидно, что происходит. Но очень сложно использовать прибор, если на него нельзя ссылаться. Нужно иметь возможность получить приспособление без доступа ... – jriff

+0

Хм, я вижу. Дело в том, что метод '.where' запрашивает базу данных в тот момент, когда она вызывается. Возможно, вам стоит попробовать другой подход, создав новый объект с использованием '.new' и передав атрибуты в качестве параметров или что-то еще. – MurifoX

Смежные вопросы