実行環境:
Rails 3.1.3
Rails3で、belong_to で関連付けられたモデルが持っている属性値でソートするには?Rails 3.1.3
例として以下のように「本(Book)」モデルと「著者(Author)」モデルがあったとします。
class Author < ActiveRecord::Base has_many :books end
2つのモデルは、has_many, belongs_to で関連づけられています。 class Book < ActiveRecord::Base belongs_to :Author end
本(Books)のリストを取得する際に著者(Author)の名前の順にソートしたいと思います。
まずは試しに
と、has_many / belongs_to の関連付けの力を信じて、うまくやってくれるだろうと期待してみる訳ですが Book.find すると「そんなカラムは知らんぞ!」とエラーが出て怒られます。 class Book < ActiveRecord::Base belongs_to :Author default_scope :order => "author.name" end
ログを見ても Book リストの取得の際の SQL 文に Author テーブルが全く登場しません。
author.name を order by のキーとして与えているところを汲んで欲しいところですが、そこまでは面倒見てくれない、ということでしょうか。
こんな時、他のテーブルを強制的に join させる素敵なコマンドがあります。 :include です。
としてやると、authorテーブルを強制的に join してくれるので上記のソートもうまくいくようになります。 class Book < ActiveRecord::Base belongs_to :Author default_scope :include => "author", :order => "author.name" end
私の環境では
返信削除default_scope :include => author, :order => "author.name"
だとエラーになり、
default_scope :include => "author", :order => "author.name"
だと上手くいきました。
参考までに。
たしかに文字列にしてあげないと値が nil の変数として扱われてしまいますね。ご指摘ありがとうございます。
削除