Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Use of projection dsl is not available in Relation#exclude

オープン
#412 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
3/5
見積もり時間
1〜2日
初心者へのやさしさ
42/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
停滞
技術スタック
ruby, sql
領域
databases

調査の方向性

Start at Relation#exclude and the projection DSL shown in the reproduction, then reproduce the query to trace where the block is evaluated. Add coverage for the expected NOT (1 = ANY(...)) SQL and confirm the projection and existing conditions remain unchanged.

索引モデルが issue の本文から書いたものです。

説明

bug help wanted

Describe the bug

It I try to use the projection dsl in combination with #exlude...

mentions
  .select { integer::count(issue_id).as(:unit_mention_count) }
  .where(unit_id: 3, read: false)
  .exclude { user_ids.any(1) }

...I get the following error:

NoMethodError:
  undefined method `any' for #<Sequel::SQL::Identifier @value=>:user_ids>
         .exclude { user_ids.any(1) }

Expected behavior

SELECT COUNT(\"mentions\".\"issue_id\") AS \"unit_mention_count\" FROM \"mentions\" WHERE ((\"unit_id\" = 3) AND (\"read\" IS FALSE) AND NOT (1 = ANY(\"mentions\".\"user_ids\")))

Workaround

Overwrite #exclude at relation

class Mentions < ROM::Relation[:sql]
  schema(:mentions, infer: true) do
  end

  def exclude(*args, &block)
    if block
      exclude(*args).exclude(schema.canonical.restriction(&block))
    elsif args.size == 1 && args[0].is_a?(Hash)
      new(dataset.exclude(coerce_conditions(args[0])))
    elsif !args.empty?
      new(dataset.exclude(*args))
    else
      self
    end
  end
end

WDYT? I could provide a PR.

主要言語
Ruby
スター
220
フォーク
97
PR マージ指標
30日以内にマージされた PR はありません

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

rom-rb/rom-sql のほかの issue

rom-rb/rom-sql の issue をすべて見る

似ている issue

Ruby の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。