我有两个表Beacon belongs to Category
和Category 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>
...
但是当信标数据变大,请求变大,如何更改我的代码来防御这个愚蠢的问题?有人可以给我一些建议或参考吗?非常感谢。
答案 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