Rails中的模型关联has_one with class_name

时间:2014-02-20 17:00:16

标签: ruby-on-rails database activerecord database-design rails-activerecord

我正在尝试找到一种模拟数据库的最佳方式 背景:

  • 我目前有两个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

1 个答案:

答案 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'