rom-rb / rom-sql

SQL support for rom-rb
https://rom-rb.org
MIT License
217 stars 93 forks source link

Relation#last removes combines #431

Open cllns opened 1 month ago

cllns commented 1 month ago

Describe the bug

Using #last on a Relation, after a using #combine, ignores the combine and just returns the regular tuple.

To Reproduce

require "rom"

Types = Dry.Types()
module Structs
  class Article < ROM::Struct
    # Including `title` and `body` is optional, we are able to declare struct-only attributes
    # If you comment these two lines out, we get the same result and same error
    attribute :title, Types::String
    attribute :body, Types::String
    attribute :favorites_count, Types::Integer
  end
end

rom = ROM.container(:sql, "sqlite::memory") do |conf|
  conf.default.create_table(:articles) do
    primary_key :id
    column :title, String, null: false
  end

  conf.default.create_table(:tags) do
    primary_key :id
    foreign_key :article_id
    column :value, String, null: false
  end

  conf.relation(:articles) do
    schema(infer: true) do
      associations do
        has_many :tags
      end
    end
  end

  conf.relation(:tags) do
    schema(infer: true) do
      associations do
        belongs_to :article
      end
    end
  end
end

articles = rom.relations[:articles]
tags = rom.relations[:tags]

articles.combine(:tags).command(:create).call(title: "First", tags: [{value: "worst"}])
articles.combine(:tags).command(:create).call(title: "Second", tags: [{value: "best"}])

puts "✅ articles.combine(:tags).first:"
puts "  " + articles.combine(:tags).first.inspect

puts

puts "❌ articles.combine(:tags).last: (MISSING TAGS!)"
puts "  " + articles.combine(:tags).last.inspect

puts

puts "✅ articles.combine(:tags).reverse.first:"
puts "  " + articles.combine(:tags).reverse.first.inspect

Outputs:

✅ articles.combine(:tags).first:
  {:id=>1, :title=>"First", :tags=>[{:id=>1, :article_id=>1, :value=>"worst"}]}

❌ articles.combine(:tags).last: (MISSING TAGS!)
  {:id=>2, :title=>"Second"}

✅ articles.combine(:tags).reverse.first:
  {:id=>2, :title=>"Second", :tags=>[{:id=>2, :article_id=>2, :value=>"best"}]}

Expected behavior

I would expect it would work just like articles.combine(:tags).reverse.first.

My environment

Related issues

https://github.com/rom-rb/rom-sql/issues/64

flash-gordon commented 1 month ago

I think it'd be better to deprecate first/last on SQL relations