17393


railsで、modelにforeign_keyを指定した場合に、orderメソッドを使ってソートしたいです。

下記のようにユーザーと部署テーブルがあり、  
ユーザーは部署に2つ所属する場合、

[code]

    class User < ActiveRecord::Base
      belongs_to :unit_first,  foreign_key: 'unit_first_id',  class_name: 'Unit'
      belongs_to :unit_second, foreign_key: 'unit_second_id', class_name: 'Unit'
    end
    
    class Unit < ActiveRecord::Base
      has_many :first_user,  foreign_key: 'unit_first_id',  class_name: 'User'
      has_many :second_user, foreign_key: 'unit_second_id', class_name: 'User'
    end
    
[/code]

一つの部署に所属するのであればこんな感じだと思いますが、

[code]

    User.joins(:unit).order("`units`.`name` ASC")
    
[/code]

指定の仕方がわかりません。。  
教えてください！

追記:

複数ソートを実装したくて下記で動きましたが、  
arelでもいいのでSQLを直書きしない方法はありますか？

[code]

    users = User
        .joins!("INNER JOIN `units` AS `unit_first` ON `unit_first`.`id` = `users`.`unit_first_id`")
        .joins!("INNER JOIN `units` AS `unit_second` ON `unit_second`.`id` = `users`.`unit_second_id`")
        .order!("`unit_first`.`name` ASC, `unit_second`.`name` ASC")
    
[/code]

追記2:

回答を参考にSQLを見てやってみて、下記で動作します

[code]

    User.joins(:unit_first, :unit_second).order("users.name ASC", "unit_seconds_users.name ASC")
    
[/code]

先にmodelでbelongs_toを定義したカラムは通常通りのテーブル名で  
後にmodelでbelongs_toを定義したカラムは

[code]

    #{複数系カラム名}_#{テーブル名}
    
[/code]

という形でエイリアスになっていました。

ただ、unit_second単体でソートする場合も一度unit_firstをjoinさせる必要があるので注意が必要っぽいです。

[code]

    User.joins(:unit_first, :unit_second).order("unit_seconds_users.name ASC")
    
[/code]

うーん。


CC BY-SA 3.0
2015-10-07T06:36:58.260
17343
2015-10-08T04:15:37.350
2015-10-08T04:15:37.350
9897
9897
question
ruby-on-rails sql rails-activerecord
railsで、modelにforeign_keyを指定した場合のorderはどう書けばいいのでしょうか。


以下のように書くのはどうでしょうか？

[code]

    User.joins(:unit_first, :unit_second).order("users.name", "users_unit_second.name")
    
[/code]

"users.name"や"users_unit_second.name"の部分は、発行されるSQLにあわせて変更する必要があるかもしれません。

### 追記

> ただ、unit_second単体でソートする場合も一度unit_firstをjoinさせる必要があるので注意が必要っぽいです。
> User.joins(:unit_first, :unit_second).order("unit_seconds_users.name ASC")

その場合はこうすれば良い気がします。

[code]

    User.joins(:unit_second).order("units.name ASC")
    
[/code]

いかがでしょうか？


CC BY-SA 3.0
2015-10-08T00:57:13.953
17393
2015-10-08T03:53:00.547
2015-10-08T03:53:00.547
85
85
17343
answer