使用:include语句查找记录

时间:2010-02-17 14:05:39

标签: mysql ruby-on-rails

我正在研究Ruby On Rails 2.3.2,我正在学习如何使用:include语句。

我想按照他们的费率收到所有公告。我有两个模型和表格:公告和费率。

模型看起来像这样:

 class Announcement <
 ActiveRecord::Base

   belongs_to :rate

 end

 class Rate < ActiveRecord::Base

   belongs_to :announcement

end

我想做类似以下的事情,但使用:include statement。

Announcement.find_by_sql 'select * from announcements ann inner join rates r on ann.id = r.announcement_id order by r.average DESC'

我已经尝试过了:

Announcement.paginate :page => params[:page], :per_page => 10, :include => [:rates], :order => 'rates.average DESC'

但它正在尝试关联rates.id = announcements.id,而不是rates.announcement_id = announcement_id

如何指定正确的关系才能使其正常工作?

1 个答案:

答案 0 :(得分:1)

正如Yuri在评论中指出的那样,你错误地定义了你的关系。

公告应have_one :rate

作为公告的命名范围:

class Announcement < ActiveRecord::Base

  has_one :rate
  named_scope :order_by_rate, :include => :rate, :order => 'rates.average DESC'

end

Announcement.order_by_rate.paginate :per_page => 10, :page => params[:page]

请注意:include:joins之间的差异作为查找选项。 :joins将加入为复杂的WHERE / ORDER子句而给出的关联或SQL JOIN片段。 :include只适用于关联,它提供了相同的优点:连接,并且还加载了关联。

渴望加载会产生影响:

使用include,@ a.rate填充在填充@a。

的同一SQL语句中
@a = Association.first :include => :rate

如果没有包含@ a.rate,则在需要之前不会填充。

@a = Association.first
@a.rate #=> @a.rate is populated here, with a separate SQL statement.