我正在尝试找到一种模拟数据库的最佳方式 背景:
我目前有两个rails模型,一个名为Environment
,另一个名为StatusUpdate
。
我有一个程序,它位于各种服务器上,并为StatusUpdates
提交Environments
。这些更新包含有关环境的四条信息。
我有一个索引屏幕,显示所有Environments
。 (模仿如下)
我存储了最近的十个StatusUpdates
和任何>在接收到新的10时删除10。
基本索引布局
- Environment1 --Status_Field_1 - Status_Field_2 - Status_Field_3 - Status_Field_4--
- Environment2 --Status_Field_1 - Status_Field_2 - Status_Field_3 - Status_Field_4--
- Environment3 --Status_Field_1 - Status_Field_2 - Status_Field_3 - Status_Field_4--
- Environment4 --Status_Field_1 - Status_Field_2 - Status_Field_3 - Status_Field_4--
当前架构
Environment(name):has_many StatusUpdates
StatusUpdate(field1, field2, field3, field4): belongs_to Environment
环境控制器
def index
@environments = Environment.paginate(page: params[:page])
end
然后我使用部分渲染@environments
。
问题
当前的模式似乎是合适的,但我怀疑在索引函数期间我必须在EnvironmentsController中额外调用数据库。我是否将Environment
架构更改为包含字段1 - 4?或者有没有办法在从每个环境的数据库中检索最新的StatusUpdate时执行Environment.paginate
?
H-man的建议听起来很完美,但我无法弄清楚为什么我在模型中收到意外的tLabel错误,并建议使用has_one关联。供参考:
class Environment < ActiveRecord::Base
has_many: status_updates
has_one: current_status, -> { order: 'created_at DESC' }, class_name: 'StatusUpdate'
end
Rails 4.0.2
答案 0 :(得分:1)
class Environment < ActiveRecord::Base
has_many :status_updates
has_one :current_status, -> {order 'created_at DESC'}, class_name: 'StatusUpdate'
end
然后你可以这样做:
def index
@environments = Environment.includes(:current_status).paginate(page: params[:page])
end
这将一次性加载所有环境的当前状态更新。我假设您使用的是Rails 4,因为您没有提到版本#。如果您使用的是旧版本的rails,请改用:
has_one :current_status, class_name: 'StatusUpdate', order: 'created_at DESC'