将逻辑移动到控制器Rails中

时间:2015-01-30 14:18:55

标签: ruby-on-rails ruby

我在视图中定义了这个变量

<% value_one.each do |s| %> 
  <% document = current_user.documents.where(skill_id: s.id ) %>  
<% end %>

所以我找到了基于skill_id的用户文档。

但是我想知道如何将这个逻辑移动到控制器中并将其分配给@documents。我不确定如何将params s.id传递给控制器​​?

我在想这个错吗?或者有一个简单的方法来做到这一点

更新

基于下面的答案,我的控制器看起来像是

def index
  @skills = Skill.all
  @documents = current_user.documents.where(skill_id: @skills.map(&:id)).all
end

我现在有1个单一查询(谢天谢地)

Document Load (0.5ms)  SELECT "documents".* FROM "documents" WHERE "documents"."user_id" = $1 AND "documents"."skill_id" IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70)  [["user_id", 1]]

由于

3 个答案:

答案 0 :(得分:2)

您以最低效的方式查询文档。如果您的value_one有100件商品,则表示您正在执行100次查询。

相反,您应该对所讨论的所有项目执行单个查询:

# Assuming 'value_one' is available....
@documents = current_user.documents.where(skill_id: value_one.map(&:id)).all

您必须将对象实际存储/映射到value_one中的任何值。一个简单的解决方案是保留当前循环并从已加载的对象列表中找到对象:

<% value_one.each do |s| %> 
  <% document = @documents.select { |d| d.skill_id == s.id } %>  
<% end %>

答案 1 :(得分:0)

我认为你需要一个带有一个参数的函数。将其分配给全局变量将不起作用,因为您需要查询的该参数。所以我说你可以做到

def userDocumentsForSkill(sid)
  return @current_user.documents.where(skill_id: sid)
end

...或类似的模板:

<% value_one.each do |s| %> 
  <% document = userDocumentsForSkill(s.id) %>  
<% end %>

没有对此进行测试,但我希望你明白这一点。

答案 2 :(得分:0)

视图中不应该有任何逻辑。

假设您在文档和技能(技能has_many文档)之间有联系,您可以document.includes(:skill)joins(:skill)。您可以在此处添加其他条件。

这将只生成一个数据库查询,您的视图将从任何逻辑中清除。

如果您希望我提供完整的代码,请与控制器一起更新该特定操作的问题。