Как создать rails habtm, который удаляет / уничтожает без ошибок? - PullRequest
1 голос
/ 18 января 2010

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

Всякий раз, когда я пытаюсь удалить объект из любой таблицы, я получаю страшное сообщение об ошибке NameError / "uninitialized constant".

Чтобы продемонстрировать, я создал пример приложения rails с классом Boy иСобачий класс.Я использовал базовый каркас для каждого и создал таблицу связывания с названием boys_dogs.Затем я добавил простую процедуру before_save, чтобы создать новую «собаку» каждый раз, когда был создан мальчик, и установить отношения, просто чтобы легко настроить вещи.

dog.rb

class Dog < ActiveRecord::Base  
  has_and_belongs_to_many :Boys  
end  

boy.rb

class Boy < ActiveRecord::Base  
  has_and_belongs_to_many :Dogs  

  def before_save  
    self.Dogs.build( :name => "Rover" )  
  end  

end  

schema.rb

ActiveRecord::Schema.define(:version => 20100118034401) do

  create_table "boys", :force => true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "boys_dogs", :id => false, :force => true do |t|
    t.integer  "boy_id"
    t.integer  "dog_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "dogs", :force => true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

end

Я видел много сообщений здесь и в других местах об аналогичных проблемах, но обычно решения используются с помощью own_to и множественного числа / единственного числаимена классов путаются.Я не думаю, что это так, но я попытался переключить выражение habtm на использование имени в единственном числе, чтобы посмотреть, помогло ли это (без удачи).Кажется, мне здесь не хватает чего-то простого.

Фактическое сообщение об ошибке:

NameError в BoysController # destroy
неинициализированная константа Boy :: Dogs

След выглядит так:

/ Библиотека / Ruby / Gems / 1.8 / gems / activesupport-2.3.4 / lib / active_support / dependencies.rb: 105: в const_missing'<br> (eval):3:in destroy_without_callbacks '
/ Библиотека / Ruby / Gems/1.8/gems/activerecord-2.3.4/lib/active_record/callbacks.rb:337:in destroy_without_transactions'<br> /Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record/transactions.rb:229:in send '
...

Спасибо.

Ответы [ 2 ]

3 голосов
/ 18 января 2010

Я не вижу твоего обратного вызова уничтожения, но вижу пару проблем.Во-первых, ваши ассоциации должны быть строчными.Поэтому dog.rb должен быть:

class Dog < ActiveRecord::Base  
  has_and_belongs_to_many :boys  
end  

, а boy.rb должен быть:

class Boy < ActiveRecord::Base  
  has_and_belongs_to_many :dogs  

  def before_save  
    self.dogs.build( :name => "Rover" )  
  end
end

Во-вторых, я считаю, что вы хотите использовать self.dogs.create вместо self.dogs.build выше,поскольку build на самом деле не спасет новый объект собаки.

0 голосов
/ 30 апреля 2010

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

Вот мои объекты модели:

class Complex < ActiveRecord::Base
   set_table_name "Complexes"
   set_primary_key "ComplexID"
   has_and_belongs_to_many :amenities
end

class Amenity < ActiveRecord::Base
   set_table_name "Amenities"
   set_primary_key "AmenityID"
end

Rails использует имя ассоциации в качестве имени таблицы, когдасоздание запроса выбора.Мое приложение работает на Unix с устаревшей базой данных MySQL, а имена таблиц чувствительны к регистру и не соответствуют соглашениям Rails.Всякий раз, когда мое приложение пыталось загрузить ассоциацию, я получал исключение, что MySQL не мог найти таблицу amenities:

SELECT * FROM `amenities` 
INNER JOIN `ComplexAmenities` ON `amenities`.AmenityID = `ComplexAmenities`.AmenityID  
WHERE (`ComplexAmenities`.ComplexID = 147 )

Я искал и искал и не мог найти способ сказать Rails использоватьправильный регистр для имени таблицы.В отчаянии я попытался передать опцию :table_name в habtm, и это сработало.Моя новая комплексная модель выглядит следующим образом:

class Complex < ActiveRecord::Base
   set_table_name "Complexes"
   set_primary_key "ComplexID"
   has_and_belongs_to_many :amenities, :table_name => 'Amenities'
end

Это работает в Rails 2.3.5.

Эта опция не упомянута в документации по Ruby on Rails.

...