我一直在尝试根据我的 rails3 应用程序中的某些范围急切加载关联,但找不到任何解决方案。
我的应用有以下型号:
class Project
has_many :entries
has_many :to_dos
class ToDo
has_may :entries
has_many :tasks
belongs_to :project
class Task
has_many :entries
belongs_to :to_do
class Entry
belongs_to :project
belongs_to :to_do
belongs_to :task
# options format: {:from_date=>(Date.today-1.week), :to_date=>(Date.today+1.week), :user_id=>60}
scope :filtered_list, lambda { |options|
condition = options[:user_id].nil? ? "true" : "user_id = #{options[:user_id]}"
condition += options[:from_date].nil? ? "" : " AND entry_date >= '#{options[:from_date]}'"
condition += options[:to_date].nil? ? "" : " AND entry_date <= '#{options[:to_date]}'"
where(condition)
}
在 projects#index 我有以下代码来获取用户的所有项目:
@projects = current_user.projects.includes(:entries, :to_dos =>[:entries, :tasks => :entries])
它获取用户的所有项目,以及预先加载关联。因此,当我执行以下循环以获取项目中的所有条目时,不会触发任何新查询。
def all_entries(options)
entries = self.entries
self.to_dos.each do |d|
entries += d.entries
d.tasks.each do |t|
entries += t.entries
end
end
end
由于这种急切的加载会获取所有条目,因此数据量比我实际需要的要多。所以我尝试对急切加载的条目应用一些条件,但找不到任何解决方案。我正在寻找类似的东西:
@projects = current_user.projects.includes(:entries.filtered_list(options), :to_dos =>[:entries.filtered_list(options), :tasks => :entries.filtered_list(options)])
这样只有满足某些条件的条目才会被加载。
我们不能在急切加载中使用范围吗?请帮助我在范围界定的同时使用 eagerloading。