gpt4 book ai didi

ruby-on-rails - 如何在 Rails 3 中测试范围

转载 作者:行者123 更新时间:2023-12-03 10:45:21 25 4
gpt4 key购买 nike

在 Rails 3 中测试范围的最佳方法是什么。在 Rails 2 中,我会执行以下操作:

规范:

it 'should have a top_level scope' do
Category.top_level.proxy_options.should == {:conditions => {:parent_id => nil}}
end

这在 Rails 3 中失败,出现“[]:ActiveRecord::Relation 的未定义方法 `proxy_options'”错误。

人们如何测试使用正确选项指定的范围?我看到您可以检查 arel 对象并可能对此做出一些期望,但我不确定最好的方法是什么。

最佳答案

撇开“如何测试”的问题不谈……这里是如何在 Rails3 中实现类似的东西……

在 Rails3 中,命名范围的不同之处在于它们只生成 Arel 关系运算符。
但是,调查!

如果您转到控制台并输入:

# All the guts of arel!
Category.top_level.arel.inspect

您将看到 Arel 的内部部件。它用于建立关系,但也可以自省(introspection)当前状态。您会注意到诸如#where_clauses 之类的公共(public)方法。

但是,作用域本身有很多有用的自省(introspection)公共(public)方法,它们比直接访问@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 以与 Rails2 中的#proxy_options 类似的方式测试范围......

关于ruby-on-rails - 如何在 Rails 3 中测试范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3025103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com