QA@IT
«質問へ戻る

質問を投稿

ActiveRecord抽象クラスのscope継承について

該当するissueも見つかったのですが、現在の状態が理解できなかったので質問させてください。
以下、具体例を引用します。

abstract_class=true なモデルで定義された scope を派生クラスで使用すると、生成される SQL からテーブル名が欠落してエラーとなる(SQL のシンタックスエラーとなる)という問題です。
具体例を挙げます。
次のような abstract_class=true なモデルを作成し、その中に適当な scope を作成します。

class ModelBase < ActiveRecord::Base
  # abstract_class=true なモデルで適当な scope を定義する.
  self.abstract_class = true
  scope :trivial, -> { where('TRUE') }
end

そのモデルを継承します。

class User < ModelBase
end

継承したモデルで親クラス(ModlelBase)で定義された scope を呼び出すと、テーブル名が欠落した SQL が生成されてしまいます。

で、本題のissueが下記のリンクです。

最後に

Soooo.... is this an unsolvable issue??
I don't know why I thought a patch was already merged and ready in 4.0.1 :worried:

とありますが、4.0.1のRailsでは解決済みと理解したのですが、

  • Rails 4.0.2 (ActiveRecord 4.0.2)
  • Ruby 2.0.0

の環境で、例と同様に以下のエラーが出ます。

    SELECT
        "" . *
    FROM
        ""
    ORDER BY
        "" . id DESC LIMIT 10 OFFSET 0
PG::SyntaxError: ERROR:  zero-length delimited identifier at or near """"
LINE 1: SELECT  "".* FROM ""   ORDER BY "".id DESC LIMIT 10 OFFSET 0
                ^
: SELECT  "".* FROM ""   ORDER BY "".id DESC LIMIT 10 OFFSET 0
  Rendered accounts/special_users/_special_users.html.erb (93.6ms)
  Rendered customers/index.html.erb within layouts/seller (140.4ms)
Completed 500 Internal Server Error in 680ms

ActiveRecord::StatementInvalid - PG::SyntaxError: ERROR:  zero-length delimited identifier at or near """"
LINE 1: SELECT  "".* FROM ""   ORDER BY "".id DESC LIMIT 10 OFFSET 0

どういう状態なのでしょうか、理解できませんでした。
どうぞご教授ください。

該当するissueも見つかったのですが、現在の状態が理解できなかったので質問させてください。
以下、具体例を引用します。

- [Rails4 ライブラリ対応状況調査](http://www.techscore.com/blog/2013/07/12/rails4-%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E5%AF%BE%E5%BF%9C%E7%8A%B6%E6%B3%81%E8%AA%BF%E6%9F%BB/)より引用

>abstract_class=true なモデルで定義された scope を派生クラスで使用すると、生成される SQL からテーブル名が欠落してエラーとなる(SQL のシンタックスエラーとなる)という問題です。
>具体例を挙げます。
>次のような abstract_class=true なモデルを作成し、その中に適当な scope を作成します。

```ruby
class ModelBase < ActiveRecord::Base
  # abstract_class=true なモデルで適当な scope を定義する.
  self.abstract_class = true
  scope :trivial, -> { where('TRUE') }
end
```

>そのモデルを継承します。

```ruby
class User < ModelBase
end
```

>継承したモデルで親クラス(ModlelBase)で定義された scope を呼び出すと、テーブル名が欠落した SQL が生成されてしまいます。

で、本題のissueが下記のリンクです。

- [Scopes defined on Abstract ActiveRecord classes are missing table names when called from subclasses](https://github.com/rails/rails/issues/10658)

最後に
>Soooo.... is this an unsolvable issue??
>I don't know why I thought a patch was already merged and ready in 4.0.1 :worried:

とありますが、4.0.1のRailsでは解決済みと理解したのですが、

- Rails 4.0.2 (ActiveRecord 4.0.2)
- Ruby 2.0.0

の環境で、例と同様に以下のエラーが出ます。

```
	SELECT
		"" . *
	FROM
		""
	ORDER BY
		"" . id DESC LIMIT 10 OFFSET 0
PG::SyntaxError: ERROR:  zero-length delimited identifier at or near """"
LINE 1: SELECT  "".* FROM ""   ORDER BY "".id DESC LIMIT 10 OFFSET 0
                ^
: SELECT  "".* FROM ""   ORDER BY "".id DESC LIMIT 10 OFFSET 0
  Rendered accounts/special_users/_special_users.html.erb (93.6ms)
  Rendered customers/index.html.erb within layouts/seller (140.4ms)
Completed 500 Internal Server Error in 680ms

ActiveRecord::StatementInvalid - PG::SyntaxError: ERROR:  zero-length delimited identifier at or near """"
LINE 1: SELECT  "".* FROM ""   ORDER BY "".id DESC LIMIT 10 OFFSET 0
```

どういう状態なのでしょうか、理解できませんでした。
どうぞご教授ください。