2016-12-11 3 views
0

У меня возникла проблема с моей консолью rails, когда я пытаюсь создать новое событие на основе пользователя. У меня такое чувство, что это очень простая ошибка, которую я получаю, но я отправляю сообщения, потому что я не уверен, как это исправить. Вот команда, которую я попытался запустить:Откат транзакции rails console

user.event = Event.create(:name => "Dummy") 

Вот мой файл БД для моего события:

class CreateEvents < ActiveRecord::Migration[5.0] 
    def change 
    create_table :events do |t| 
     t.string :name 

     t.timestamps 
    end 
    end 
end 

Вот мой файл базы данных пользователей:

class CreateUsers < ActiveRecord::Migration[5.0] 
    def change 
    create_table :users do |t| 
     t.string :name 
     t.string :email 
     t.string :event 
     t.integer :code 


     t.timestamps 
    end 
    end 
end 

Вот мой Пользователь .rb файл:

class User < ApplicationRecord 
    has_secure_password 
    has_many :events 

    def User.digest(string) 
     cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost 
     BCrypt::Password.create(string, cost: cost) 
    end 
end 

Вот мой Even t.rb file:

class Event < ApplicationRecord 
    belongs_to :user 
end 

ответ

1

В ваших таблицах нет внешнего ключа. Предположим, что вы на самом деле намерены иметь модели, как описано («событие принадлежит пользователю»/«пользователь имеет много событий»), вам нужно добавить столбец user_id в таблицу событий, а не строку event в таблицу пользователей.

Вы можете создать миграции или столбца определение миграции/модели генераторов с использованием references типа:

rails g model event name:string user:references 

или

rails g migration add_user_id_to_event user:references 

который добавит столбец и необходимые индексы.

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

user.event = Event.create 

(нет такого метода, как User#event=), но вместо этого

user.events << Event.create(...) 
1

Его не простая ошибка. Это довольно много, что неверно.

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

class User < ApplicationRecord 
    has_many :user_events 
    has_many :events, through: :user_events 
end 

class Event < ApplicationRecord 
    has_many :user_events 
    has_many :users, through: :user_events 
end 

# this is a join model. 
class UserEvent < ApplicationRecord 
    belongs_to :user 
    belongs_to :event 
end 

A has_many :through association часто используется, чтобы создать много-ко-многим связи с другой моделью. Эта ассоциация указывает, что модель объявления может быть сопоставлена ​​с нулем или более экземплярами другой модели , пройдя третью модель. http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

Вы можете генерировать UserEvent модели и миграцию, которая создает таблицу соединит работу:

rails g model user_event user:belongs_to event:belongs_to 

Это создаст user_events таблицы с user_id и event_id внешним ключом. Вы должны также откатить миграцию, которая создает таблицу пользователей и исправить:

class CreateUsers < ActiveRecord::Migration[5.0] 
    def change 
    create_table :users do |t| 
     t.string :name 
     t.string :email 
     t.string :password_digest # !!! 
     t.integer :code 
     t.timestamps 
    end 
    end 
end 

Примечание добавление password_digest колонки - это требуется для has_secure_password. Если вы уже запустили эту миграцию на производственную базу данных или привержен и толкнул его, вы должны вместо этого создать отдельные миграции, которые фиксируют ошибки:

class AddPasswordDigestToUsers < ActiveRecord::Migration[5.0] 
    def change 
    add_column(:users, :password_digest, :string) 
    end 
end 

class RemoveEventFromUsers < ActiveRecord::Migration[5.0] 
    def change 
    remove_column(:users, :event) 
    end 
end 

Чтобы создать событие, которое связано с пользователем вы можете сделать :

event = user.events.new(name: "Dummy") # does not persist the record 
event = user.events.create(name: "Dummy") 

Вы можете все присвоить записи с любого конца с помощью лопаты оператора:

user.events << event 
event.users << user 

Является ли это подходящей ассоциацией для меня?

Моя основная цель для моего приложения - сделать так, чтобы пользователь имел partys и у этих сторон были песни.

Партия с одним пользователем звучит довольно хромой. Однако, если вы хотите создать особые отношения для пользователя вы можете создать отдельную ассоциацию:

class User < ApplicationRecord 
    has_many :user_events 
    has_many :events, through: :user_events 
    has_many :owned_events, class_name: 'Event', foreign_key: 'owner_id' 
end 

class Event < ApplicationRecord 
    has_many :user_events 
    has_many :users, through: :user_events 
    belongs_to :owner, class_name: 'User' 
end 

class AddOwnerIdToEvents < ActiveRecord::Migration[5.0] 
    def change 
    add_column(:events, :owner_id, :integer) 
    add_foreign_key(:events, :users, column: :owner_id) 
    end 
end 

Другой способ решения этой проблемы является добавление столбца UserEvent присоединиться к модели, которая определяет, что ассоциация. Но это довольно далеко от вашего уровня мастерства.

+0

Спасибо за очень подробное описание моей проблемы. Я закончил работу ассоциаций. Мой последний вопрос заключается в том, чтобы назначить каждому пользователю событие. Моя основная цель для моего приложения - сделать так, чтобы у пользователя были partys, и у этих сторон есть песни. Я иду в правильном направлении для этого приложения? – Aaron

+0

Вы должны действительно прочитать руководства по направляющим [статья об ассоциациях] (http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association) и [интерфейс запросов активной записи] (http: //guides.rubyonrails.org/active_record_querying.html#joining-tables). – max

+0

Хорошо, сделаем! :) – Aaron

Смежные вопросы