Как вытащить псевдоним столбца из объединенных таблиц в rom-sql?

Оценка condition привела к NA. Условие if должно иметь либо результат TRUE, либо FALSE.

if (NA) {}
## Error in if (NA) { : missing value where TRUE/FALSE needed

Это может случиться случайно в результате результатов вычислений:

if(TRUE && sqrt(-1)) {}
## Error in if (TRUE && sqrt(-1)) { : missing value where TRUE/FALSE needed

Чтобы проверить, отсутствует ли объект, используйте is.na(x) , а не x == NA.


См. также связанные ошибки:

Ошибка в if / while (условие) {: аргумент имеет нулевую длину

Ошибка в if / while (условие): аргумент не интерпретируется как логический

if (NULL) {}
## Error in if (NULL) { : argument is of length zero

if ("not logical") {}
## Error: argument is not interpretable as logical

if (c(TRUE, FALSE)) {}
## Warning message:
## the condition has length > 1 and only the first element will be used

0
задан cutalion 16 January 2019 в 14:11
поделиться

1 ответ

Невозможно предложить какое-либо решение, если версия используемых библиотек не указана. Для rom-sql 2.4.0 это просто работает:

#!/usr/bin/env ruby

# frozen_string_literal: true

require 'bundler/inline'

gemfile(false) do
  source 'https://rubygems.org'

  gem 'sqlite3'
  gem 'rom-sql', '2.4.0'
  gem 'rspec'
end

require 'rspec'
require 'rspec/autorun'

require 'dry-types'
require 'rom-sql'
require 'sqlite3'

RSpec.describe do
  let(:uri) { 'sqlite::memory' }
  let(:conn) { Sequel.connect(uri) }
  let(:conf) { ROM::Configuration.new(:sql, conn) }
  let(:container) { ROM.container(conf) }

  let(:avatars) { container.relations[:avatars] }
  let(:users) { container.relations[:users] }

  before do
    conn.create_table(:avatars) do
      primary_key :id
      Integer :user_id
      String :url
    end

    conn.create_table(:users) { primary_key :id }

    conf.relation(:avatars) do
      schema(infer: true) do
        associations do
          belongs_to :user
        end
      end
    end

    conf.relation(:users) do
      schema(infer: true) do
        associations do
          has_many :avatars
        end
      end
    end
  end

  subject(:relation) do
    users.join(:avatars).select { relations[:avatars][:url].as(:avatar_url) }
  end

  it do
    users.insert
    avatars.insert(user_id: 1, url: 'avatars/1')
    avatars.insert(user_id: 1, url: 'avatars/2')

    expect { relation.pluck(:avatar_url) }.not_to raise_error
    expect(relation.pluck(:avatar_url)).to eq ['avatars/1', 'avatars/2']
  end
end
0
ответ дан Vasily Kolesnikov 16 January 2019 в 14:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: