Ruby on rails 允许通过WHERE子句返回多个记录

Ruby on rails 允许通过WHERE子句返回多个记录,ruby-on-rails,ruby-on-rails-5,Ruby On Rails,Ruby On Rails 5,我有一个库存表,如: +--------------+---------+-----------+ | inventory_id | film_id | available | +--------------+---------+-----------+ | 1 | 1 | true | | 2 | 1 | false | | 3 | 1 | false | |

我有一个库存表,如:

+--------------+---------+-----------+
| inventory_id | film_id | available |
+--------------+---------+-----------+
|            1 |       1 | true      |
|            2 |       1 | false     |
|            3 |       1 | false     |
|            4 |       2 | false     |
+--------------+---------+-----------+
+---------+--------+------+
| film_id | title  | cost |
+---------+--------+------+
|       1 | Title1 | 0.99 |
|       2 | Title2 | 1.99 |
+---------+--------+------+
还有一张像这样的电影桌:

+--------------+---------+-----------+
| inventory_id | film_id | available |
+--------------+---------+-----------+
|            1 |       1 | true      |
|            2 |       1 | false     |
|            3 |       1 | false     |
|            4 |       2 | false     |
+--------------+---------+-----------+
+---------+--------+------+
| film_id | title  | cost |
+---------+--------+------+
|       1 | Title1 | 0.99 |
|       2 | Title2 | 1.99 |
+---------+--------+------+
我的模型和关联是正确的,允许我访问两个表中的数据,但我试图对库存中具有可用值的每个项目的成本求和:false

我的尝试是只返回电影_id1的一个副本,尽管有两个记录匹配。我在这件事上犯了什么错误

控制器文件:

def index
  @inventory = Inventory.where(available: false)
  @films = Film.where(film_id: @inventory.pluck(:film_id)
end 
视图:



我当前的结果是对所需的列求和,但只包括一个film_id:1实例,而不是两个实例。

我可以通过更改删除film.where子句来实现这一点,使我的模型:

def index
  @inventory = Inventory.where(available: false)
end
并将我的观点改为:

<% sum = 0 %>

<% @inventory.each do |i| %>
  <%= i.film.title %>
  <% cost = i.film.cost %>
  <% sum += cost.to_f %>
  <%= cost %>
<% end %>

<p>Total Sum:</p>
<%= sum %>

总额:


然而,这似乎不是完成这项任务的最佳方式。如果有人有更好或更有效的方法,请分享

问题是你想要实现什么?当前查询返回一个或多个库存中当前可用的所有胶片。如果你想得到所有电影的总成本,最好使用
Film.all.sum(:cost)
。如果要获取库存中项目的总价值。1)
film\u id
2
不应返回,因为没有可用的film 2。2) 您当前只选择了一部可用电影,而不是选择了与可用电影相同的数量。为什么您希望有两个相同电影对象的实例?只有一部电影ID为1,这就是为什么它只返回一部。我想你把你的描述弄混了,你有两个电影的清单,但只有一部电影有这个id。你们两个都给我带来了一个沟通错误。我的目标是返回库存中每个不可用项目的成本,然后返回所有成本的总和。所以,我需要有两个电影实例,因为有两个库存实例不可用。希望这能澄清问题。我的临时解决方案如下所示。您可以这样做:
@films\u not\u in\u available\u inventory=Film.join(:inventory)。where(inventory:{available:false})
然后对于所有成本的总和:
@films\u not\u in\u available\u inventory.sum(:cost)
谢谢Yoshiji先生,这是一个有用的解决方案!为了提高效率,请使用
@inventory=inventory.where(available:false)。includes(:film)
来防止N+1查询。剩下的没问题,也许你可以重构代码一点,但不会有更好的性能。谢谢arieljuod,这很有帮助!