Оставляя в стороне вопрос о том, как тестировать ... вот как добиться подобных вещей в Rails3 ...
В Rails3 именованные области отличаются тем, что они просто генерируют реляционные операторы Arel.
Но, исследуйте!
Если вы идете в консоль и набираете:
# All the guts of arel!
Category.top_level.arel.inspect
Вы увидите внутренние части Арела. Он используется для построения отношения, но также может быть проанализирован для текущего состояния. Вы заметите публичные методы, такие как #where_clauses и тому подобное.
Тем не менее, сама область имеет много полезных открытых методов для самоанализа, которые упрощают доступ к @arel:
.
# Basic stuff:
=> [:table, :primary_key, :to_sql]
# and these to check-out all parts of your relation:
=> [:includes_values, :eager_load_values, :preload_values,
:select_values, :group_values, :order_values, :reorder_flag,
:joins_values, :where_values, :having_values, :limit_value,
:offset_value, :readonly_value, :create_with_value, :from_value]
# With 'where_values' you can see the whole tree of conditions:
Category.top_level.where_values.first.methods - Object.new.methods
=> [:operator, :operand1, :operand2, :left, :left=,
:right, :right=, :not, :or, :and, :to_sql, :each]
# You can see each condition to_sql
Category.top_level.where_values.map(&:to_sql)
=> ["`categories`.`parent_id` IS NULL"]
# More to the point, use #where_values_hash to see rails2-like :conditions hash:
Category.top_level.where_values_hash
=> {"parent_id"=>nil}
Используйте это последнее: #where_values_hash для тестирования областей аналогично #proxy_options в Rails2 ....