帮助ActiveRecord查询

时间:2011-03-10 12:37:12

标签: ruby-on-rails ruby-on-rails-3 activerecord

型号:

class User < ActiveRecord::Base
  has_many :attendances
  has_many :courses, :through => :attendances
end

class Course < ActiveRecord::Base
  has_many :attendances
end

class Attendance < ActiveRecord::Base
  belongs_to :user
  belongs_to :course
end

迁移:

create_table(:users) do |t|
  t.string :name
end

create_table(:courses) do |t|
  t.string :name
end

create_table(:attendances) do |t|
  t.references :user, :course
  t.date :date
end

问题

我想查询:

  • 所有课程列表
  • 每个课程的特定用户上次出勤日期(如果有)

将以下内容组合到一个查询中的最佳方法是什么?

@courses = Course.all
@user = User.first
@attendances = @user.attendances.group('course_id').order('date DESC')

请注意,需要包含用户尚未参加的课程。

任何建议都非常感谢。

更新

我要找的结果如下:

Course            Last attended
===============================
Some course       2011-03-09
More training     Not Attended
Another course    2010-12-25

在SQL中,我将此查询编写为:

SELECT * FROM courses AS c
LEFT OUTER JOIN attendances AS a ON a.course_id=c.id
WHERE a.user_id=1
GROUP BY a.course_id
ORDER BY a.date DESC;

我总是可以在Rails中执行这个SQL,但是如果可能的话,我宁愿避免这种情况并做“Rails方式”。

2 个答案:

答案 0 :(得分:1)

你的has_many通过关系应该是这样的:

  class User < ActiveRecord::Base
    has_many :attendances
    has_many :courses, :through => :attendances
  end

  class Course < ActiveRecord::Base
    has_many :attendances
    has_many :users, :through => :attendances
  end

  class Attendance < ActiveRecord::Base
    belongs_to :user
    belongs_to :course
  end

请解释你的问题。因为

@user.courses will give you only related courses
Course.all will give you all courses

编辑:

Course.find(:all, :joins => 'LEFT OUTER JOIN attendances ON attendances.course_id = 
courses.id', :conditions => ['attendances.user_id = ?', 1], :group => 
'attendances.course_id', :order => 'attendances.date DESC')

我希望它对你有用。

答案 1 :(得分:1)

“Rails-Way”用于定义模型中的小型查找器,然后将它们链接到控制器中。

在课堂出勤中,您可以定义一个新方法

def self.last_attendance
  maximum("date")
end

课堂上的科西嘉......

def self.ordered
  order("name DESC")
end

等等。然后在控制器中,您可以使用不同的组合。这种方法的最大优点是

  • 取景器方法的可重用性
  • 分类
  • 更好的代码可读性