Простой ответ - настроить ваши ассоциации в противоположность тому, что у вас есть, например:
# app/models/content.rb
class Content < ActiveRecord::Base
has_one :profile_image, :class_name => 'Image'
has_one :background_image, :class_name => 'Image'
end
# app/models/image.rb
class Image < ActiveRecord::Base
belongs_to :content
end
Вам вообще не нужны внешние ключи 'background_image_id' и 'profile_image_id' в таблице содержимого.
Однако есть более элегантное решение: наследование одной таблицы. Настройте его сейчас, если вы хотите, чтобы фоновые и профильные изображения в будущем вели себя немного иначе, плюс это прояснит ваш код сегодня.
Сначала добавьте в таблицу изображений столбец с именем type:
# command line
script/generate migration AddTypeToImages type:string
rake db:migrate
Теперь настройте ваши модели так:
# app/models/content.rb
class Content < ActiveRecord::Base
has_one :profile_image
has_one :background_image
end
# app/models/image.rb
class Image < ActiveRecord::Base
belongs_to :content
end
# app/models/background_image.rb
class BackgroundImage < Image
# background image specific code here
end
# app/models/profile_image.rb
class ProfileImage < Image
# profile image specific code here
end
Теперь вы можете делать все, например, получать список всех фоновых изображений:
# script/console
BackgroundImage.all
Это в большей степени относится к модели данных, которую вы пытаетесь создать, обеспечивает простейшее расширение в будущем и дает вам несколько новых интересных методов сегодня.
UPDATE:
С тех пор я создал статью для блога под названием Наследование в одной таблице с тестами , в которой более подробно описывается тестирование.