我正在尝试显示父记录的索引,包含一个急切加载的子级,根据子字段对它们进行排序,然后分页。此功能无需添加Limit
(或paginate)命令即可运行,但使用它时,我只能在我的数据库中收到50条记录。我一直撞着墙试图找出我在这里做错了什么。我将从简化的Schema开始,然后是模型,最后是我的索引控制器函数。
架构:
ActiveRecord::Schema.define(version: 20140307193043) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
create_table "envs", force: true do |t|
t.string "name"
...
end
add_index "envs", ["name"], name: "index_envs_on_name", unique: true, using: :btree
create_table "updateresults", force: true do |t|
t.string "env_name"
...
end
add_index "updateresults", ["env_name", "created_at"], name: "index_updateresults_on_env_name_and_created_at", using: :btree
end
环境模型
Class Env < ActiveRecord::Base
has_many :updateresults, foreign_key: :env_name, primary_key: :name,
dependent: :destroy
has_one :current_status, -> { order 'created_at DESC' },
foreign_key: :env_name, primary_key: :name,
class_name: 'Updateresult'
validates :name, presence: true, length: { minimum: 3, maximum: 20 },
uniqueness: { case_sensitive: false }
end
Updateresult模型
class Updateresult < ActiveRecord::Base
belongs_to :env, foreign_key: :env_name, primary_key: :name
default_scope -> { order('created_at DESC') }
end
环境控制器
def index
@envs = Env.includes(:current_status).order('updateresults.value asc, name asc').paginate(page: params[:page])
end
SQL for good measure
SELECT "envs"."id" AS t0_r0, "envs"."name" AS t0_r1, "envs"."created_at" AS t0_r2, "envs"."updated_at" AS t0_r3, "updateresults"."id" AS t1_r0, "updateresults"."content" AS t1_r1, "updateresults"."created_at" AS t1_r2, "updateresults"."updated_at" AS t1_r3, "updateresults"."env_name" AS t1_r4, "updateresults"."version" AS t1_r5, "updateresults"."bbj_status" AS t1_r6, "updateresults"."host" AS t1_r7, "updateresults"."repo" AS t1_r8 FROM "envs" LEFT OUTER JOIN "updateresults" ON "updateresults"."env_name" = "envs"."name" ORDER BY updateresults.repo asc, name asc LIMIT 30
另外值得一提的是,这个测试冻结了RSpec
expect(page).to have_selector('li', text: env.name)