Создание связи «один ко многим» с ActiveRecord с использованием псевдонима для имени модели - PullRequest
0 голосов
/ 28 декабря 2018

Я создаю социальный сайт музыканта.Пользователи могут создавать группы, и с тех пор они считаются manager группы.Я хочу сослаться на экземпляр группы пользователя как manager.

Несмотря на указание отношений в моделях и указание class_name: "User" и foreign_key: "manager", приложение не будет сохранять новую группу вбаза данных.

user.rb

class User < ApplicationRecord
    has_many :bands, foreign_key: 'manager'

    validates_presence_of :name
    validates_presence_of :password_digest
    validates_presence_of :username
    validates_uniqueness_of :username

    has_secure_password

    def admin?
        self.role == "admin"
    end
end

band.rb

class Band < ApplicationRecord
    belongs_to :manager, class_name: 'User', foreign_key: 'manager'
    validates_presence_of :name
    validates_uniqueness_of :name
    validates_presence_of :description
end

schema.rb

ActiveRecord::Schema.define(version: 2018_12_27_040935) do

    create_table "bands", force: :cascade do |t|
        t.string "name"
        t.text "description"
        t.integer "manager_id"
        t.datetime "created_at", null: false
        t.datetime "updated_at", null: false
        t.index ["manager_id"], name: "index_bands_on_manager_id"
    end

    create_table "users", force: :cascade do |t|
        t.string "name"
        t.string "username"
        t.string "password_digest"
        t.datetime "created_at", null: false
        t.datetime "updated_at", null: false
        t.string "role", default: "user"
    end

end

seed.rb

Отредактировано seed.rb

User.destroy_all
Band.destroy_all

user = User.new(name: 'John')
user.save
user = User.find_by_name('John')

user_band = user.bands.new(name: 'Band #1', description: 'My first band')

if user_band.save
    puts "Done"
else
    puts "Incomplete"
end

Я запускаю rails db:seed и ожидаю увидеть 'Done' в консоли.Я получаю 'Incomplete'.

При тестировании в консоли rails экземпляр группы имеет ошибку "Manager must exist"

Также существует один пользовательский экземпляр с идентификатором 1.

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

band.rb

belongs_to :manager, class_name: 'User', foreign_key: 'manager_id'

user.rb

has_many :bands, foreign_key: 'manager_id'

Чтобы проверить, попробуйте это:

manager = User.create(...user_information)
jms = Band.new(name: "Jams", description: "Hey, its our first band.")
jms.manager = manager
jms.save

Если это не удалось, каков выводjms.errors

0 голосов
/ 28 декабря 2018

Хорошо, поэтому я изменил свой файл миграции, который, очевидно, вызывал проблему.schema.rb выглядит идентично, но seeds.rb теперь это…

модели

user.rb has_many :bands, foreign_key: 'manager_id'

band.rb belongs_to :manager, class_name: 'User', foreign_key: 'manager_id'

seed.rb

User.destroy_all
Band.destroy_all

user = User.new(name: 'John', username: "johnny", password: "nice")
user.save
user = User.find_by_name('John')

user_band = Band.new(name: 'Band #1', description: 'My first band', manager_id: user.id)

if user_band.save
    puts "Done"
else
    puts "Incomplete"
end

Ошибки были: ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: main.managers: INSERT INTO "bands" ("name", "description", "manager_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?)

Изменен файл миграции для полос

Ранее

create_table :bands do |t|
    t.belongs_to :manager, foreign_key: true
    t.string :name
    t.text :description
    t.timestamps
end

Изменено на

create_table :bands do |t|
    t.belongs_to :manager
    t.string :name
    t.text :description
    t.timestamps
end

Удалена опция , foreign_key: true, Удалена БД, запущены миграции и теперь.

Работает…

0 голосов
/ 28 декабря 2018

Обновите ассоциации следующим образом:

band.rb

belongs_to :manager, class_name: 'User', foreign_key: 'manager_id'

user.rb

has_many :bands, foreign_key: 'manager_id'

Перед созданием группы менеджер должен присутствовать в таблице пользователей.

manager = User.find(1)
band = manager.bands.new(name: "Jams", description: "Hey, its our first band.") 
if band.save
   puts "Done"
else
   puts "Incomplete"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...