在create (或任何method(attr, attr, attr)样式方法)中有条件地包含属性的最佳方法是什么?
@user = User.find_by_name("Sam") # <- might not exist
Store.create(
name: "Some Store",
email: "store@example.com",
user_id: @user.id if @user.present? # <- CONCEPT ONLY - Should be added if condition is true to prevent error
)如果找不到user_id: @user.id,则行@user抛出一个错误,因此是nil。
发布于 2018-05-21 16:33:52
我可以对您的代码进行的最起码的更改是:
Store.create(
name: "Some Store",
email: "store@example.com",
user_id: @user&.id
)这是使用安全导航操作符(&.)对nil值“忽略方法调用”。
但是,为什么要获取一个可能为零的对象,然后尝试在其上调用一个方法呢?考虑到原始帖子的上下文,您可以直接这样做:
Store.create(
name: "Some Store",
email: "store@example.com",
user: @user
)无论@user是否存在,这都会很好地工作。
...Or --甚至,您真正想要做的事情是:
Store.create(
name: "Some Store",
email: "store@example.com",
user: User.find_or_create_by(name: 'Sam')
)发布于 2018-05-21 16:16:57
您忘记了.create()的参数是哈希的快捷方式。
hash = {
name: "Some Store",
email: "store@example.com"
}
hash[:user_id] = @user.id if @user.present?
Store.create(hash)另一个选项是向.create传递一个块:
Store.create do |s|
s.name = "Some Store"
s.email = "store@example.com"
s.user_id = @user.id if @user
endhttps://stackoverflow.com/questions/50452705
复制相似问题