首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件包含属性是创建方法- Rails 5

条件包含属性是创建方法- Rails 5
EN

Stack Overflow用户
提问于 2018-05-21 16:10:21
回答 2查看 488关注 0票数 0

create (或任何method(attr, attr, attr)样式方法)中有条件地包含属性的最佳方法是什么?

代码语言:javascript
复制
@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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-21 16:33:52

我可以对您的代码进行的最起码的更改是:

代码语言:javascript
复制
Store.create(
  name: "Some Store",
  email: "store@example.com",
  user_id: @user&.id
)

这是使用安全导航操作符(&.)对nil值“忽略方法调用”。

但是,为什么要获取一个可能为零的对象,然后尝试在其上调用一个方法呢?考虑到原始帖子的上下文,您可以直接这样做:

代码语言:javascript
复制
Store.create(
  name: "Some Store",
  email: "store@example.com",
  user: @user
)

无论@user是否存在,这都会很好地工作。

...Or --甚至,您真正想要做的事情是:

代码语言:javascript
复制
Store.create(
  name: "Some Store",
  email: "store@example.com",
  user: User.find_or_create_by(name: 'Sam')
)
票数 2
EN

Stack Overflow用户

发布于 2018-05-21 16:16:57

您忘记了.create()的参数是哈希的快捷方式。

代码语言:javascript
复制
hash = {
  name: "Some Store",
  email: "store@example.com"
} 
hash[:user_id] = @user.id if @user.present?
Store.create(hash)

另一个选项是向.create传递一个块:

代码语言:javascript
复制
Store.create do |s|
  s.name = "Some Store"
  s.email = "store@example.com"
  s.user_id = @user.id if @user
end
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50452705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档