Relation#last removes combines

Open
#431 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
3/5
Estimated time
1-2 days
Newbie friendliness
42/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Stale
Tech stack
ruby, sqlite
Domain
database

Research direction

Start with the reproduction in the issue and trace the Relation#last, combine, and reverse.first entry points. Compare how these operations load combined tags, then verify that articles.combine(:tags).last includes the associated tags just like reverse.first. The issue provides no test file or implementation path, so locate the relevant relation tests before making changes.

Written by the indexing model from the issue text.

Description

bug help wanted

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

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

Dominant language
Ruby
Stars
220
Forks
97
PR merge metrics
No merged PRs in 30d

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from rom-rb/rom-sql

All issues in rom-rb/rom-sql

Similar issues

More Ruby issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.