0

Я создаю приложение RoR, которое имеет классы User и Product. У многих пользователей много фотографий, а также продукт, но каждый должен также иметь один profile_picture.Rails Active Record Associations для модели, которая может отображаться на разных типах моделей.

Пользователи:

class User < ActiveRecord::Base 
    has_many :pictures 
end 

Продукты:

class Product < ActiveRecord::Base 
    has_many :pictures 
end 

Я изо всех сил, чтобы определить pictures модель, которая в настоящее время:

class Picture < ActiveRecord::Base 
    has_one :user 
    has_one :product 
end 

Схема для картин выглядит следующим образом (временные метки опущены для краткости):

create_table "pictures", force: true do |t| 
    t.string "image_url" 
end 

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

class AddPicturesToUsersAndWalks < ActiveRecord::Migration 
    def change 
    add_column :users, :profile_picture, :picture 
    add_column :products, :profile_picture, :picture 
    end 
end 

Я прочитал http://guides.rubyonrails.org/association_basics.html и http://guides.rubyonrails.org/migrations.html я не понимаю, как эти отношения должны быть сформированы или где в базе данных должны храниться внешние ключи.

Я не могу просмотреть схему для пользователя или продуктов таблицы (rake db:migrate не жалуется при запуске), потому что возвращается следующая ошибка в файле схемы (я предполагаю, что это связано с profile_picture в обоих, но им не уверены, как procede :

# Could not dump table "users" because of following NoMethodError 
# undefined method `[]' for nil:NilClass 

Пожалуйста, обратите внимание, им с помощью Ruby On Rails 4 и базы данных sqlite3

ответ

1

Rails документации фактически описывает почти точно, что вы должны сделать

.

A polymorphic association.

class Picture < ActiveRecord::Base 
    belongs_to :imageable, polymorphic: true 
    # `imageable` is just a name for you to reference and can by anything 
    # It is not a class, a table or anything else 
    # It affects only corresponding DB column names 
end 

class User < ActiveRecord::Base 
    has_many :pictures, as: :imageable 
    # read as: I am an `imageable`, I can have a picture as one 
end 

class Product < ActiveRecord::Base 
    has_many :pictures, as: :imageable 
end 

В базе данных это достигается путем связывания не только через id, но и через название модели: в corresponging столбцы <model>_id и <model>_type. В отличие от более простых ассоциаций, где имя класса известно и требуется только id.

class CreatePictures < ActiveRecord::Migration 
    def change 
    create_table :pictures do |t| 
     t.string :data 
     t.integer :imageable_id 
     t.string :imageable_type 
     t.timestamps 
    end 
    end 
end 
+0

Спасибо, есть способ связать изображение профиля, чтобы я мог получить к нему доступ с помощью @ user.profile_picture тоже? – user3576112

+0

@ user3576112 Похож на 'has_one: profile_picture, class_name:" Изображение ", как:: imageable'. Что-то похожее. –

+0

спасибо, будет ли это сохранено как ссылка в пользовательской таблице или просто picture_id? – user3576112