【问题标题】:has_one association not adding methods to belongs_to classhas_one 关联未将方法添加到 belongs_to 类
【发布时间】:2019-10-14 21:27:32
【问题描述】:

我有两个表 User 和 UserToken。用户has_one: token 和用户令牌belongs_to :user。我的印象是这会将 UserToken#User 方法添加到 UserToken 类中。但是,我得到:

'#' 的未定义方法 'user' 与 以下 'UserToken.where(user_id: 1).user

是我没有正确理解关联还是我没有正确设置它?

用户控制器:

  def get
    user = UserToken.where(user_id: 1).user

    render json: user.to_json
  end

用户模型:

class User < ApplicationRecord
  has_one :user_token
end

用户令牌模型:

class UserToken < ApplicationRecord
  belongs_to :user
end

迁移:

    def change
        create_table :users do |t|
      # This id comes from Auth0
      t.datetime :date
      t.timestamp :updated_at
      t.timestamp :created_at
    end

    create_table :user_tokens do |t|
      t.belongs_to :user
      # This comes from plaid when a user signs in
      t.string :token
      t.timestamp :updated_at
      t.timestamp :created_at
    end
  end

架构:

ActiveRecord::Schema.define(version: 2019_09_19_004350) do

  create_table "user_tokens", force: :cascade do |t|
    t.bigint "user_id"
    t.string "token"
    t.datetime "updated_at"
    t.datetime "created_at"
    t.index ["user_id"], name: "index_user_tokens_on_user_id"
  end

  create_table "users", force: :cascade do |t|
    t.datetime "date"
    t.datetime "updated_at"
    t.datetime "created_at"
  end
end

【问题讨论】:

    标签: ruby-on-rails ruby activerecord associations


    【解决方案1】:

    你想要的是:

    UserToken.where(user_id: 1).first.user
    

    或者更好:

    UserToken.find_by(user_id: 1).user
    

    您收到“未定义方法”错误,因为 #where 返回一个 ActiveRecord::Relation 并且 ActiveRecord 关系没有 #user 方法。

    UserToken.where(user_id: 1).class.name
    #=> "ActiveRecord::Relation"
    UserToken.where(user_id: 1).first.class.name
    #=> "UserToken"
    

    【讨论】:

    • 你太棒了!谢谢!
    • 很高兴我能帮上忙 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多