Rails 4,命令has_many:through。它什么都不做

时间:2015-07-07 18:15:14

标签: ruby-on-rails ruby performance ruby-on-rails-4 rails-activerecord

我遇到这种情况:

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)。

如何做得更好?

更新

我从模特“儿童”改为“学生”。

1 个答案:

答案 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