Часть моего приложения RoR отвечает за управление портфелем дизайнов веб-сайтов.
Один дизайн веб-сайта может иметь много изображений, связанных с ним.
Одно изображение может быть связано только с одним дизайном.
Я использую оператор has_many с параметром: through, чтобы связать изображения с дизайном через таблицу соединений. А при удалении изображения связанная запись в объединяемой таблице должна быть удалена. Так что у меня есть следующие модели
Для изображений:
class Image < ActiveRecord::Base
has_one :images_site_designs , :class_name => "ImagesSiteDesigns" , :dependent => :destroy
has_one :site_design , :through => :images_site_designs
end
Для site_designs:
class SiteDesign < ActiveRecord::Base
belongs_to :client
has_many :images_site_designs , :class_name => "ImagesSiteDesigns"
has_many :images , :through => :images_site_designs
end
И присоединиться к таблице images_site_designs:
class ImagesSiteDesigns < ActiveRecord::Base
belongs_to :image
belongs_to :site_design
end
Создание новых изображений для site_designs в порядке, поэтому следующий код работает нормально:
@site_design = SiteDesign.find(params[:id])
@site_design.images << Image.new(params[:image])
Но когда я пытаюсь удалить изображение, появляется следующая ошибка:
ActiveRecord::StatementInvalid in ImagesController#destroy
Mysql::Error: Unknown column 'id' in 'where clause': DELETE FROM `images_site_designs` WHERE `id` = NULL
Похоже, что рельсы используют неправильное имя столбца для запроса таблицы соединений images_site_designs. Как я могу это исправить?
UPD:
Функции image_controller, которые удаляют изображение:
def destroy
@image = Image.find(params[:id])
@image.destroy
respond_to do |format|
format.html { redirect_to(images_url) }
format.xml { head :ok }
end
end
Миграция:
class CreateImages < ActiveRecord::Migration
def self.up
create_table :images do |t|
t.string :url
t.string :name
t.text :description
t.timestamps
end
end
def self.down
drop_table :images
end
end
class CreateSiteDesigns < ActiveRecord::Migration
def self.up
create_table :site_designs do |t|
t.string :name
t.text :concept
t.text :description
t.integer :client_id
t.timestamps
end
end
def self.down
drop_table :site_designs
end
end
class CreateImagesSiteDesigns < ActiveRecord::Migration
def self.up
create_table :images_site_designs , :id => false do |t|
t.integer :image_id
t.integer :site_design_id
end
end
def self.down
drop_table :images_site_designs
end
end