Mongoid проблема отношения многих ко многим при добавлении записи - PullRequest
1 голос
/ 10 сентября 2011

Я использую Mongoid / MongoDB с Rails и пытаюсь заставить работать отношения многие ко многим.В основном книги и категории, где книги могут быть в нескольких категориях.Я продолжаю получать сообщение об ошибке:

undefined method `metadata' for "4e6aaec8ffb1900c19000002":String

при попытке добавить новую книгу и поместить ее в категории.Вот что я использую для моделей, формы, метода создания и того, что сообщает сервер.

Похоже, он пытается обновить book_ids и cat_ids, но ничего не получает для cat_ids.Я пробовал много разных вещей, но не уверен, как заставить это работать.

Модель книги

class Book
  include Mongoid::Document
  field :title, :type => String
  field :description, :type => String
  has_and_belongs_to_many :cats
end

Модель кошки (категории)

class Cat
  include Mongoid::Document
  field :name, :type => String
  field :description, :type => String
  has_and_belongs_to_many :books
end

Это из формы, которая генерирует выбор категории и допускает несколько вариантов выбора:

<div class="field">
  <%= label_tag "Cats" %><br />
  <%= f.collection_select :cats, Cat.all, :id, :name, {}, :multiple => true %>
</div>

Метод создания в контроллере книг:

def create
    @book = Book.new(params[:book])
    redirect_to(@book, :notice => 'Book was successfully created.')
end

С сервера при отправкеФорма:

    Started POST "/books" for 127.0.0.1 at Fri Sep 09 17:30:37 -0700 2011
      Processing by BooksController#create as HTML
      Parameters: {"commit"=>"Create Book", "authenticity_token"=>"+OAIJM3NRPrUv0u1yfDEkkE2gvPQ7n0P6zPU9ZtqXlk=", 
"utf8"=>"✓", "book"=>{"title"=>"The Golf & Tennis Book", 
"cats"=>["4e6aaec8ffb1900c19000002", "4e6aaee8ffb1900c19000006"], 
"description"=>"Both golf and tennis in this book, so it's in both categories."}}
    MONGODB blog_development['system.namespaces'].find({})
    MONGODB blog_development['cats'].update({:_id=>{"$in"=>[]}}, {"$pull"=>{"book_ids"=>BSON::ObjectId('4e6aafadffb1900c1900000b')}})
    MONGODB blog_development['system.namespaces'].find({})
    MONGODB blog_development['books'].update({"_id"=>BSON::ObjectId('4e6aafadffb1900c1900000b')}, {"$set"=>{"cat_ids"=>[]}})
    Completed 500 Internal Server Error in 24ms

    NoMethodError (undefined method `metadata' for "4e6aaec8ffb1900c19000002":String):
      app/controllers/books_controller.rb:46:in `new'
      app/controllers/books_controller.rb:46:in `create'

1 Ответ

0 голосов
/ 03 февраля 2013

Это недействительно

book.update_attributes({:cats => [ cat.id ]})

должно быть

book.update_attributes({:cat_ids => [ cat.id ]})

или

book.update_attributes({:cats => [ cat ]})
...