Skip to content

Relation#last removes combines  #431

Description

@cllns

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

  • Rom-sql 3.6
  • Affects my production application: No
  • Ruby version: 3.3
  • OS: macOS 14.4.1

Related issues

#64

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions