我正在研究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
如何指定正确的关系才能使其正常工作?
答案 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.