我在Rails 3中遇到了多对多关系的问题。这里涉及的3个模型是:
class Device < ActiveRecord::Base
attr_accessible :name, :protocol, :address, :status, :room_id
belongs_to :room
has_many :device_abilities
has_many :abilities, :through => :device_abilities
end
class Ability < ActiveRecord::Base
attr_accessible :name
has_many :device_abilities
has_many :devices, :through => :device_abilities
end
class DeviceAbility < ActiveRecord::Base
belongs_to :device
belongs_to :ability
end
我在种子文件中有以下内容用于测试:
device_abilities = DeviceAbility.create([
{ device_id: '1', ability_id: '1'},
{ device_id: '1', ability_id: '2'},
{ device_id: '1', ability_id: '3'},
{ device_id: '1', ability_id: '4'},
{ device_id: '1', ability_id: '5'},
{ device_id: '2', ability_id: '1'},
{ device_id: '2', ability_id: '2'},
{ device_id: '2', ability_id: '3'},
{ device_id: '2', ability_id: '4'},
{ device_id: '2', ability_id: '5'}
])
(实际的设备和能力也已定义,我可以正常与它们互动)。
当我尝试
时,我收到了异常错误def show
@device = Device.find(params[:id])
puts @device.abilities
end
(puts用于调试;如果我将它放入变量,我也不能使用它)。错误是:
undefined method `zero?' for nil:NilClass
谁能告诉我哪里出错了?
更新
按要求,错误跟踪:
app/controllers/devices_controller.rb:13:in `puts'
app/controllers/devices_controller.rb:13:in `puts'
app/controllers/devices_controller.rb:13:in `show'
,架构是:
create_table "abilities", :force => true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "devices", :force => true do |t|
t.string "name"
t.string "protocol"
t.string "address"
t.boolean "status"
t.integer "room_id"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "device_abilities", :force => true do |t|
t.integer "device_id"
t.integer "ability_id"
t.datetime "created_at"
t.datetime "updated_at"
end
答案 0 :(得分:2)
在这里回答:Rails 3.2 Uniqueness validation raises undefined method 'zero?' for nil:Nilclass
您的sum
方法正在添加到Array
并覆盖Rails'Enumerable#sum
。
如何解决?
您是否编写过名为sum的方法,可能在名为的模块中 可枚举还是数组?如果是这样,那是一个很好的起点。你可以 重命名您的方法,或者您可以尝试更改您的方法以匹配 使用以下代码替换#sum代码的Rails方法:
模块可枚举的def sum(identity = 0,&amp; block) 如果block_given? 地图(安培;块)的.sum(同一性) 其他 注入(:+)||身分 最终结束 (再次:从Rails 3.2 Uniqueness validation raises undefined method 'zero?' for nil:Nilclass获取)
答案 1 :(得分:1)
好的,我终于设法将其缩小到我放在我的environment.rb文件中的一段代码:
class Array
def sum
self.inject{|sum,x| sum + x }
end
end
这是为了让我能够array.sum
得到一个答案,这个答案一直运作良好。我非常感谢任何评论为什么这会导致这样的问题,以及是否有办法解决这个问题,因为我的代码的其他部分都依赖于这种方法。
谢谢!
答案 2 :(得分:0)
问题可能是您不使用:dependent => :destroy
默认行为是将foreign_key
设置为nil
。因此,如果您有DeviceAbility
的对象并将Device
对象与Ability
对象相关联,那可以,但是当您删除其中一个时,您不能再使用它了,因为已删除的对象是{ {1}}然后。并且nil
没有名为nil
的方法。你可以使用这个查询:
zero?
如果返回任何结果,那么你知道问题的原因是什么!