我在我的应用中,帖子作为想法,这些想法属于活动和状态。 我希望按活动对一个状态进行排序,以便我在控制器中进行
@idees_en_place = Idee.where(statut_id= "2")
@activites = Activite.all
在我看来:
<% @activites.each do |activite| %>
<div class="idee en-place col-lg-5" style="background:#<%= activite.color%>">
<h2><%= activite.name %></h2>
<p>
<% @idees_en_place.where(activite_id = activite.id).limit(3).each do |idee| %>
<div class="idee">
<h6><%= link_to idee.title, idee %></h6>
</div>
<% end %>
</p>
</div>
<% end %>
但这不起作用,在活动的每个部分中,想法都没有排序。 我认为这是一个小错误,但我不知道如何解决这个问题
答案 0 :(得分:1)
@idees_en_place = Idee.where(statut_id= "2")
此代码存在两个问题。
首先,id
是Integer
类型(除非您已将其定义为String
)。
其次,它是您传递给where
子句的键值,并将它们作为
:status_id => 2 # old hashrocket syntax
或
status_id: 2 # new syntax
这部分也是如此
@idees_en_place.where(activite_id = activite.id)
应该是
@idees_en_place.where(activite_id: activite.id)
答案 1 :(得分:0)
在控制器
中@idees_en_place = Idee.where(statut_id: 2)
@activites = Activite.all
在查看
中<% @activites.each do |activite| %>
<div class="idee en-place col-lg-5" style="background:#<%= activite.color%>">
<h2><%= activite.name %></h2>
<p>
<% @idees_en_place.where(activite_id: activite.id).limit(3).each do |idee| %>
<div class="idee">
<h6><%= link_to idee.title, idee %></h6>
</div>
<% end %>
</p>
</div>
<% end %>
答案 2 :(得分:0)
我只是想指出你会遇到一个N + 1查询问题,为了避免这种情况,你应该预先加载所有内容,而不是在视图中进行查询。
控制器:
#change if the association name is different
@activites = Activite.includes(:idees)
视图
<% @activites.each do |activite| %>
<div class="idee en-place col-lg-5" style="background:#<%= activite.color%>">
<h2><%= activite.name %></h2>
<p>
<% activitie.idees[0..2].each do |idee| %>
<div class="idee">
<h6><%= link_to idee.title, idee %></h6>
</div>
<% end %>
</p>
</div>
<% end %>
备注:强>
我使用了[0..2]
格式,因为我想避免ActiveRecord执行新查询,另一种方法是使用类似的东西限制查询
@activites = Activite.includes(:idees).merge(Idee.limit(3))
然后你不需要在视图中使用任何限制,但我没有对此进行测试,现在无法访问rails计算机。
答案 3 :(得分:0)
我认为以下代码可以帮助您:
由于您的Idee属于活动和状态,这就是您在Idee表中拥有activity_id和status_id的原因。
您可以使用以下方式查找状态的所有内容:
Idee.where(:status_id => 2)
您可以使用订单
在Asc或desc顺序中对Idee进行排序idees = Idee.join(:activity).where(:status_id => 2).order(:activity_id => :asc)
idees = Idee.join(:activity).where(:status_id => 2).order(:activity_id => :desc)
<% activity_id = -1%>
<@idees.each do |idee| %>
<div class="idee en-place col-lg-5" style="background:#<%= idee.activite.color%>">
<h2><%= idee.activity.name %></h2>
<p>
<% if activity_id != idee.activity_id %>
<% activity_id = idee.activity.id %>
<% counter = 0 %>
<% end %>
<% if counter < 3 %>
<% counter = counter + 1%>
<div class="idee">
<h6><%= link_to idee.title, idee %></h6>
</div>
<% end %>
</p>
</div>