用rails上的ruby查询“where”

时间:2015-05-19 08:27:29

标签: ruby-on-rails ruby where

我在我的应用中,帖子作为想法,这些想法属于活动和状态。 我希望按活动对一个状态进行排序,以便我在控制器中进行

@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 %>

但这不起作用,在活动的每个部分中,想法都没有排序。 我认为这是一个小错误,但我不知道如何解决这个问题

4 个答案:

答案 0 :(得分:1)

@idees_en_place = Idee.where(statut_id= "2")

此代码存在两个问题。

首先,idInteger类型(除非您已将其定义为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>