模型中的方法在erb中选择

时间:2017-01-17 22:45:56

标签: ruby-on-rails

在我的模型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不是正确的解决方案,然后我在一个选择选项中得到两者的组合,而不是选项中的每一个。

1 个答案:

答案 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_unaut_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 %>