rails 4 has_many对同一模型的不同实例的工作方式不同

时间:2014-03-22 16:17:15

标签: ruby-on-rails ruby model associations

我有以下型号:

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。

2 个答案:

答案 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中,您将获得多条记录。