我遇到这种情况:
class Student < ActiveRecord::Base
has_many :tickets
has_many :movies, through: :tickets
end
class Movie < ActiveRecord::Base
has_many :tickets
has_many :students, through: :tickets
end
class Ticket < ActiveRecord::Base
belongs_to :movie, counter_cache: true
belongs_to :student
end
class Cinema < ActiveRecord::Base
has_many :movies, dependent: :destroy
has_many :students, through: :movies
end
我在我的( movie_controller.rb )控制器中有这段代码:
def show
@tickets = @movie.tickets.includes(:student)
end
现在我的网格( show.html.erb )我有这种情况:
<% @tickets.each do |ticket| %>
<tr>
<td><%= ticket.student.id %></td>
<td><%= ticket.student.code %></td>
<td><%= ticket.student.last_name %> <%= ticket.student.first_name %></td>
<td><%= ticket.hours %></td>
<td><% if ticket.payed %>Yes<% else %>No<% end %></td>
</tr>
<% end %>
现在我想通过他们的“last_name,first_name”为学生订购,但如果我在我的控制器中使用此代码:
@tickets = @movie.tickets.includes(:student).order('students.last_name')
在我的控制台中我有一个像这样的SQL查询:
"AS t0_r0 .... AS t0_r1 ..."
依旧...... 这是正常的吗?
我的逻辑错了吗?
如果我在我的模型中使用这样的代码:
class Movie < ActiveRecord::Base
has_many :tickets
has_many :students, -> { order('last_name, first_name') }, through: :tickets
end
无效。我的列表不是按姓氏和名字排序,而是默认(id)。
如何做得更好?
更新:
我从模特“儿童”改为“学生”。
答案 0 :(得分:0)
&#34;&#34; AS t0_r0 .... AS t0_r1 ...&#34;等等......这是正常的吗?&#34;
是的,包含已经实现为外部联接,因此order by可以应用于ticket表返回的行。
要使用此范围,您需要执行类似的操作:
student.rb
def self.by_last_name
order(:last_name)
end
ticket.rb
def self.by_student_last_name
joins(:student).merge(Student.by_last_name)
end
......然后......
@tickets = @movie.tickets.by_student_last_name