Rails按父parent_to关联中的字段排序

Vla*_*ust 2 ruby sqlite sorting ruby-on-rails

我有三个型号在我的Rails应用程序,User,Number,和Message:

class User < ActiveRecord::Base
  has_many :numbers
  has_many :messages, through: :numbers
end

class Number < ActiveRecord::Base
  belongs_to :user
  has_many :messages
end

class Message < ActiveRecord::Base
  belongs_to :number
end
Run Code Online (Sandbox Code Playgroud)

Number 迁移文件有:

t.string :digits, index: true # Example: '14051234567' (no + sign)
Run Code Online (Sandbox Code Playgroud)

在我的控制器中:

sort_mode = # asc or desc
@messages = current_user.messages.order(???)
Run Code Online (Sandbox Code Playgroud)

问题是我想按照数字的数字对这些消息进行排序.

如何动态地(取决于sort_mode)?

编辑:

sort_mode = 'asc'
@messages = current_user.messages.includes(:number)
order = { number: { digits: sort_mode } }
@messages = @messages.order(order)
Run Code Online (Sandbox Code Playgroud)

^不起作用.第二个论点必须是一个方向.

另外,order('number.digits': sort_mode)投掷:

SQLite3::SQLException: no such column: messages.number.digits: SELECT  "messages".* FROM "messages" INNER JOIN "numbers" ON "messages"."number_id" = "numbers"."id" WHERE "numbers"."user_id" = ?  ORDER BY "messages"."number.digits" ASC LIMIT 10 OFFSET 0
Run Code Online (Sandbox Code Playgroud)

Sea*_*ber 11

你需要使用includes.尝试:

@messages = current_user.messages.includes(:number).order('numbers.digits ASC')
Run Code Online (Sandbox Code Playgroud)