【问题标题】:Rails - how to instantly get id of inserted rowRails - 如何立即获取插入行的 id
【发布时间】:2012-10-01 04:39:26
【问题描述】:

我在我的应用程序中使用这个逻辑: 控制器

@current_user = User.find_or_create_from_oauth(auth_hash)

user.rb

  def self.find_or_create_from_oauth(auth_hash)
    provider = auth_hash["provider"]
    uid = auth_hash["uid"].to_s

    case provider      
       when 'twitter'
        if user = self.find_by_twitter_uid(uid)
          return user
        else
          return self.create_user_from_twitter(auth_hash)
        end

    end
  end

  def self.create_user_from_twitter(auth_hash)   
    a = self.create({
      :twitter_uid => auth_hash["uid"],
      :name => auth_hash["info"]["name"]
    })
    puts a.inspect
    user = User.find_by_twitter_uid(a.twitter_uid)
    puts '---'
    puts user.inspect
  end

self.create 之后我需要立即运行这一行:

Assignment.create(:user_id => a.id, :role_id => 2)

问题是,puts user.inspect 行返回如下内容:

#<User id: nil, name: "...name...", twitter_uid: "96580821", provider: "twitter", created_at: nil, updated_at: nil>

为什么在hash中返回id:nil

或者,有没有其他方法,如何获取上次创建记录的ID?

【问题讨论】:

  • 上面的 puts a.inspect 应该已经为您提供了新插入的用户记录的 id。我认为您不需要通过 twitter_uid 找到用户;您可以直接使用 'a' 对象(正如您在Assignment.create 行中所做的那样确实是正确的。这条行不工作吗?
  • 记录可能实际上并未被保存。确保保存的记录确实有效。
  • 安德鲁·马歇尔可能是对的。如果创建不成功,我会将a = self.create 更改为a = self.create! 以引发错误。

标签: ruby-on-rails ruby activerecord model


【解决方案1】:

如果用户已经正确保存,可以直接使用a

a.assignments.create(:role_id => 2)

否则(使用create!而不是create检查)可能会出现验证错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 2011-07-24
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多