将额外数据传递给find_or_create

Cei*_*ish 14 ruby-on-rails

我一直想知道的关于rails的东西是能够将额外的数据传递给rails中的find_or_create方法.例如,我不能做以下事情

User.find_or_create_by_name('ceilingfish', :email => 'an_email@a.domain', :legs => true, :face => false)
Run Code Online (Sandbox Code Playgroud)

我可以

u = User.find_or_create_by_name('ceilingfish')
u.update_attributes(:email => 'an_email@a.domain', :legs => true, :face => false)
Run Code Online (Sandbox Code Playgroud)

但那更加丑陋,还需要三个查询.我想我能做到

User.find_or_create_by_name_and_email_and_face_and_legs('ceilingfish','an_email@a.domain',true, false)
Run Code Online (Sandbox Code Playgroud)

但那种意味着我知道什么样的价值观email,legsface是.有谁知道这是否有一种非常优雅的方式?

Har*_*tty 21

试试这个:

User.find_or_create_by_name(:name=>'ceilingfish', 
        :email => 'an_email@a.domain', :legs => true, :face => false)
Run Code Online (Sandbox Code Playgroud)

如果有其他参数find_or_create_by_,则必须将所有参数作为哈希传递.

Rails 4

  User.create_with(
    email: 'an_email@a.domain', 
    legs: true, face:false
  ).find_or_create_by(:name=>'ceilingfish')
Run Code Online (Sandbox Code Playgroud)

  • @Ceilingfish:这实际上是你的第一个表格不起作用的错误.http://rails.lighthouseapp.com/projects/8994/tickets/4457-find_or_create_by_foo-when-foo-is-protected-attribute (2认同)