回滚事务 rails 控制台
Rollback transaction rails console
当我尝试基于用户创建新事件时,我的 rails 控制台遇到了问题。我感觉这是我遇到的一个非常简单的错误,但我发帖是因为我不确定应该如何修复它。这是我尝试 运行 的命令:
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
这是我的 User.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
这是我的 Event.rb 文件:
class Event < ApplicationRecord
belongs_to :user
end
您的 table 中没有外键。假设您实际上打算按照说明 ("event belongs to user"/"user has many events") 使用模型,您需要向事件 table 添加一列 user_id
,而不是 event
字符串给用户 table.
您可以使用 references
类型的 migration/model 生成器创建迁移或列定义:
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(...)
这不是一个简单的错误。有很多事情是错误的。
如果您想要一个用户可以拥有多个事件的关系,并且一个事件可以属于多个用户,您需要创建一个连接 table。因为在用户或事件上存储外键 table 会创建一对多关系,这可能不是您想要的。
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
is often used to set up a many-to-many
connection with another model. This association indicates that the
declaring model can be matched with zero or more instances of another
model by proceeding through a third model.
http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association
您可以通过 运行ning 生成 UserEvent
模型和创建连接 table 的迁移:
rails g model user_event user:belongs_to event:belongs_to
这将创建一个带有 user_id
和 event_id
外键列的 user_events
table。您还应该回滚创建用户 table 的迁移并修复它:
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")
您可以使用 shovel 运算符从任一端分配记录:
user.events << event
event.users << user
这适合我吗?
My main goal for my application is to make it so a user has partys and
those parties have songs.
只有一个用户的聚会听起来很蹩脚。然而,如果你想为用户创建一个特殊的关系,你可以创建一个单独的关联:
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
连接模型添加一列,指定关联是什么。但这远远超出了您的技能水平。
当我尝试基于用户创建新事件时,我的 rails 控制台遇到了问题。我感觉这是我遇到的一个非常简单的错误,但我发帖是因为我不确定应该如何修复它。这是我尝试 运行 的命令:
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
这是我的 User.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
这是我的 Event.rb 文件:
class Event < ApplicationRecord
belongs_to :user
end
您的 table 中没有外键。假设您实际上打算按照说明 ("event belongs to user"/"user has many events") 使用模型,您需要向事件 table 添加一列 user_id
,而不是 event
字符串给用户 table.
您可以使用 references
类型的 migration/model 生成器创建迁移或列定义:
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(...)
这不是一个简单的错误。有很多事情是错误的。
如果您想要一个用户可以拥有多个事件的关系,并且一个事件可以属于多个用户,您需要创建一个连接 table。因为在用户或事件上存储外键 table 会创建一对多关系,这可能不是您想要的。
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
is often used to set up a many-to-many connection with another model. This association indicates that the declaring model can be matched with zero or more instances of another model by proceeding through a third model. http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association
您可以通过 运行ning 生成 UserEvent
模型和创建连接 table 的迁移:
rails g model user_event user:belongs_to event:belongs_to
这将创建一个带有 user_id
和 event_id
外键列的 user_events
table。您还应该回滚创建用户 table 的迁移并修复它:
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")
您可以使用 shovel 运算符从任一端分配记录:
user.events << event
event.users << user
这适合我吗?
My main goal for my application is to make it so a user has partys and those parties have songs.
只有一个用户的聚会听起来很蹩脚。然而,如果你想为用户创建一个特殊的关系,你可以创建一个单独的关联:
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
连接模型添加一列,指定关联是什么。但这远远超出了您的技能水平。