gpt4 book ai didi

ruby-on-rails - Rails 可选的 belongs_to

转载 作者:数据小太阳 更新时间:2023-10-29 06:21:52 24 4
gpt4 key购买 nike

我正在编写用于库存管理的 Rails 前端。我希望用户能够注册产品,所以我有:

class User < ActiveRecord::Base
has_many :products
# <snip>
end

class Product < ActiveRecord::Base
belongs_to :user
# <snip>
end

问题在于产品是在用户注册之前创建的。也就是说,调用 Product.create 并将 user_id 设置为 nil 是完全可以接受的。不过,您可以想象,Rails 不支持开箱即用:

> Product.create!
(0.3ms) SELECT COUNT(*) FROM "products" WHERE "products"."type" IN ('Product')
(0.1ms) begin transaction
(0.1ms) rollback transaction
ActiveRecord::RecordInvalid: Validation failed: User can't be blank
from ~/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-3.2.13/lib/active_record/validations.rb:56:in `save!'

我想过很多笨拙的解决方法,其中最吸引人的是让 NullUser 子类化 User 并使用它来创建产品。但这仍然看起来像是一个 hack。这有什么 Rails Way?

谢谢。


相关迁移:

class AddUseridToProducts < ActiveRecord::Migration
def change
add_column :products, :user_id, :integer
end
end

及以后:

class Changeuseridtobeoptionalforproducts < ActiveRecord::Migration
def change
change_column :products, :user_id, :integer, null: true
end
end

最佳答案

只是 rails 5 的一个更新,如果你想要这种行为,你需要传递这个选项:

belongs_to :user, optional: true

在 Rails 5 中,每当我们定义 belongs_to 关联时,默认情况下都需要关联记录。

更新
如果您仍想默认使用旧行为,您可以将配置添加到您的 application.rb 文件中。

# /config/application.rb
config.active_record.belongs_to_required_by_default = false

注意:有一些 issues在具有此配置的 Rails 5 早期版本上,但目前已修复,已在候选版本 5.2.3 上测试。

关于ruby-on-rails - Rails 可选的 belongs_to,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16699877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com