Rails表显示和数据库设计?

时间:2015-08-23 00:53:39

标签: ruby-on-rails database-design

我有两个表Beacon belongs to CategoryCategory has many beacons,在信标表中,我添加了一个foreign key: category_id,但是当我想在表格中显示时,我需要category_name in类别表,现在我使用愚蠢的方式如下:

...
<% @beacons.each do |beacon| %>
            <tr>
              <td><%= beacon.beacon_uuid %></td>
              <% @category_name = Category.find(beacon.category_id).category_name %>
              <td><%= @category_name %></td>
...

但是当信标数据变大,请求变大,如何更改我的代码来防御这个愚蠢的问题?有人可以给我一些建议或参考吗?非常感谢。

2 个答案:

答案 0 :(得分:2)

这听起来像你指的是N + 1查询,其中执行的查询数量等于信标数量+1。如果是这样,你的查询看起来与下面的类似。

select beacons.* from beacons;
select categories.* from categories where categories.id = 1;
select categories.* from categories where categories.id = 2;
select categories.* from categories where categories.id = 3;

假设您的信标模型声明了belongs_to :category关系,可以通过使用includes急切加载控制器中的关联来避免这种情况

def index
  @beacons = Beacon.all.includes(:category)
end

然后可以更改视图以利用此功能,而不是从数据库中为每个信标提取类别的新副本

<%= beacon.category.category_name %>

答案 1 :(得分:0)

在信标本身中有一个类别及其属性的助手。

在Rails中,您可以双向进行:

.img-marquee { width: 100%; } 将返回该类别拥有的所有信标及其属性的数组 Category.beacons将返回其类别的属性。

遵循相同的逻辑,你只需要这个:

Beacon.category