在我的模型Acte
中,我有以下代码:
def aut_complet_un
unless auteur_un_lieu ==""
auteur_un_autorite + " de " + auteur_un_lieu + ", " + auteur_un_nom
else
auteur_un_autorite + ", " + auteur_un_nom
end
end
def aut_complet_deux
unless auteur_deux_lieu ==""
auteur_deux_autorite + " " + auteur_deux_lieu + " " + auteur_deux_nom
else
auteur_deux_autorite + ", " + auteur_deux_nom
end
end
当我在我的erb.html中执行此操作时:
<%= f.select :acte, Acte.all.collect {|s| s.aut_complet_un}, include_blank: true %>
然而,这非常低效,因为Acte包含完整(和长)文本列,因此将整个actes放入Hash然后只获得必要的方法似乎效率不高。
我如何
1 /只在erb.html中获取aut_complet_un和aut_complet_deux(换句话说,摆脱.all方法)和
2 /两者明显合并? aut_complet_un + aut_complet_deux
不是正确的解决方案,然后我在一个选择选项中得到两者的组合,而不是选项中的每一个。
答案 0 :(得分:1)
1/ fetch only aut_complet_un and aut_complet_deux in the erb.html (in other words, get rid of the .all method)
您可以使用select
仅从数据库中选择相关列。这不是方法aut_complet_un
和aut_complet_deux
,而是这些方法所依赖的列,例如:
Acte.select(:auteur_un_autorite, :auteur_un_lieu, :auteur_un_nom).all.map(&:aut_complet_un)
Acte.select(:auteur_deux_autorite, :auteur_deux_lieu, :auteur_deux_nom).all.map(&:aut_complet_deux)
注意:map
语法只是编写与收集相同内容的较短方式。
选择意味着只返回那些列 - 忽略任何其他更大的列。
然而......在你认为这是导致它变慢的原因之前......你看过你的桌子是巨大的还是你有正确的索引?这些也可能造成巨大的减速......:)
2/ merge the two distinctly ? aut_complet_un + aut_complet_deux is not the right solution and then I get in one select option the combination of both, rather than each in an option.
我不清楚你真正想要的是什么?你想要两个选择框吗?一个选择_un
,一个选择_deux
?或者一个包含两者列表的选择框?如果是后者,那么你可以使用这样的东西:
class Acte
# you'll think of a better name for this...
def self.select_options
options = self.select(:auteur_un_autorite, :auteur_un_lieu, :auteur_un_nom).all.map(&:aut_complet_un)
options += self.select(:auteur_deux_autorite, :auteur_deux_lieu, :auteur_deux_nom).all.map(&:aut_complet_deux)
options
end
这可以在你的erb中使用:
<%= f.select :acte, Acte.select_options, include_blank: true %>