Ассоциация has_one, не добавляющая методы в класс принадлежащих - PullRequest
1 голос
/ 15 октября 2019

У меня есть две таблицы User и UserToken. Пользователь has_one: token и UserToken belongs_to :user. У меня сложилось впечатление, что это добавит метод UserToken # User в класс UserToken. Однако я получаю:

неопределенный метод 'user' для '#' со следующим 'UserToken.where (user_id: 1) .user

Не яправильно понять ассоциацию или я правильно ее не настроил?

UsersController:

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

    render json: user.to_json
  end

Модель пользователя:

class User < ApplicationRecord
  has_one :user_token
end

UserToken Модель:

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

1 Ответ

1 голос
/ 15 октября 2019

То, что вы хотите:

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"
...