我有以下型号:
class Person < ActiveRecord::Base
has_many :friends
end
class Friend < ActiveRecord::Base
belongs_to :person
end
模型比这更复杂,但这就是主意。然后在我的rails控制台中:
person = Person.new
person.friends
=> #<ActiveRecord::Associations::CollectionProxy []>
这似乎没错 - 这个人还没有朋友,因为它是一个新模型,所以它返回一个空数组。
然而,当我抬起一个有很多朋友并试图摧毁它们的人时,我明白了:
person = Person.where(name: 'Test')
if person
person.friends.destroy_all
end
NoMethodError: undefined method `friends' for #<ActiveRecord::Relation::ActiveRecord_Relation_Person:0x007f9cf42741e0>
为什么方法friends
未定义为person
,而不是另一个?我使用的是rails 4.0.0和ruby 2.0.0。
答案 0 :(得分:1)
Person.where
返回ActiveRecord::Relation
,您将其视为Person
对象。
尝试:
people = Person.where(name: 'Test')
people.each { |p| p.friends.destroy_all }
示例,对于第一人称对象:
person = Person.where(name: 'Test').first
if person
person.friends.destroy_all
end
答案 1 :(得分:0)
实际上它的工作方式不同。由于你正在使用的对象名称,这是混乱。
案例1。
person = Person.new
person.friends
这是创建一个单个对象,因此工作正常。
现在案例2:
persons= Person.where(name : 'test')
persons.each do |person|
person.friends..destroy_all
end
在案例2中,您将获得多条记录。