我使用的是Ruby 1.9.3p392和rails 3.2.17
我有设备。设备属于设备类型和设备状态。 在我的设备模型中,我设置了动态范围如下:
DeviceStatus.all.each do |device_status|
scope device_status.name, where(:device_status_id => device_status.id)
end
设备状态的名称属性仅允许[0-9a-zA-Z] 它基本上为我在数据库中的每个设备状态创建一个范围。
我有3种设备状态,Active,Unused和Obsolete
在控制台中,我可以使用:
DeviceType.all.each do |d|
DeviceStatus.all.each do |s|
p d.devices.send(s.name).count
end
end
我得到了预期的结果:每种设备类型的不同状态的计数。
我在视图中有这个,它完美无瑕。我还使用此方法使用用户选择的动态范围从控制器过滤我的index.html.erb。我也使用与其他类相同的原则来过滤index.html.erb
但是,当我运行功能测试时出现问题,我在视图中收到以下错误消息:
undefined method for 'Active' []:ActiveRecord::Relation
如果我试图避免关联,只需在我的循环中用Devices.send()替换d.devices.send(),我得到:
undefined method for 'Active' #<Class:0xxxxxxxx>
以前有人见过吗?
答案 0 :(得分:0)
看起来d.devices
将是ActiveRecord
个对象的数组,因为DeviceType
会有很多Devices
。我认为您需要按照以下要求执行以下任一操作:
p d.devices[0].send(s.name).count
或
DeviceType.all.each do |d|
DeviceStatus.all.each do |s|
d.devices..each do |device|
p device.send(s.name).count
end
end
end
答案 1 :(得分:0)
我想我发现了这个问题。
执行rake test:functionals时,数据库被清除,并且在处理模型后,数据库中会加载fixture。
因此,在加载Device模型时,数据库中没有DeviceStatus,导致模型不创建范围。之后会加载灯具,并且在尝试调用我的设备关系中不存在的示波器时测试失败。