Это ошибка Mongoid или Rails3? Вот полные коды, которые вы можете воспроизвести странную «ошибку» - PullRequest
0 голосов
/ 16 марта 2012
$ rails -v
Rails 3.1.1
$ ruby -v
ruby 1.9.2p312 (2011-08-11 revision 32926) [i686-linux]

Если вы хотите воспроизвести проблему, просто следуйте за мной:

Сначала создайте эти три модели (просто скопируйте):

#school.rb
class School
  include Mongoid::Document
  include Mongoid::Timestamps

  has_many :students

end

#student.rb
class Student
  include Mongoid::Document
  include Mongoid::Timestamps

  has_many :books
  belongs_to :school

  accepts_nested_attributes_for :books

end

#book.rb
class Book
  include Mongoid::Document
  include Mongoid::Timestamps

  field :name

  belongs_to :student

  validate :check

  def check
    # The calling for the 'school' method caused the issue
    self.student.school
  end

end

Во-вторых, запустите консоль и вставьте:

ruby-1.9.2-head :001 > School.destroy_all;Student.destroy_all; Book.destroy_all; School.create
ruby-1.9.2-head :001 >  Student.create school_id: School.first.id, 'books_attributes' => {'1' => {'name' => 'I am a book'}}

Тогда, давайте посмотрим, что случилось:

ruby-1.9.2-head :002 > Book.count
MONGODB xxx_development['$cmd'].find({"count"=>"books", "query"=>{}, "fields"=>nil})
=> 2 

И даже больше, если вы установите отношение 'student has_many books' к 'autosave: true':

class Student
 ......
 has_many :books, autosave: true
 ......
end

Посмотрим, что будет:

ruby-1.9.2-head :001 > School.destroy_all;Student.destroy_all; Book.destroy_all; School.create
ruby-1.9.2-head :001 >  Student.create school_id: School.first.id, 'books_attributes' => {'1' => {'name' => 'I am a book'}}
ruby-1.9.2-head :002 > Student.count
MONGODB xxx_development['$cmd'].find({"count"=>"students", "query"=>{}, "fields"=>nil})
 => 2 

ruby-1.9.2-head :004 > Student.all.to_a
MONGODB xxx_development['students'].find({})
 => [#<Student _id: 4f62a8341d41c81bc6000002, _type: nil, created_at: 2012-03-16 02:40:52 UTC, updated_at: 2012-03-16 02:40:52 UTC, school_id: BSON::ObjectId('4f62a8341d41c81bc6000001')>, #<Student _id: 4f62a8341d41c81bc6000003, _type: nil, created_at: 2012-03-16 02:40:52 UTC, updated_at: 2012-03-16 02:40:52 UTC, school_id: nil>] 

ruby-1.9.2-head :005 > Book.count
MONGODB xxx_development['$cmd'].find({"count"=>"books", "query"=>{}, "fields"=>nil})
 => 2
ruby-1.9.2-head :006 > Book.all.to_a
MONGODB xxx_development['books'].find({})
 => [#<Book _id: 4f62a8341d41c81bc6000003, _type: nil, created_at: 2012-03-16 02:40:52 UTC, updated_at: 2012-03-16 02:40:52 UTC, name: "I am a book", student_id: BSON::ObjectId('4f62a8341d41c81bc6000002')>, #<Book _id: 4f62a8341d41c81bc6000002, _type: nil, created_at: 2012-03-16 02:40:52 UTC, updated_at: 2012-03-16 02:40:52 UTC, name: nil, student_id: nil>] 

Эта ошибка действительно сводит меня с ума. Почему дополнительные модели при вызове 'школы' в методе проверки книги?

Или я что-то не так сделал?

1 Ответ

1 голос
/ 16 марта 2012

Код в порядке, вы не делаете ничего неправильного - но у Mongoid нет проблем с этим же кодом на master или 2.4.x. Смотрите мои предложения здесь, чтобы найти виновника:

https://github.com/mongoid/mongoid/issues/1826

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...