2017-01-17 3 views
0

В моей модели 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 содержит полные (и длинные) текстовые столбцы, поэтому включение целых действий в хэш, а затем получение только необходимых методов кажется неэффективным.

Как я

1/получать только aut_complet_un и aut_complet_deux в erb.html (другими словами, избавиться от метода .all) и

2/слияние двух отчетливо? aut_complet_un + aut_complet_deux - это не правильное решение, и затем я получаю в одном выбранном варианте сочетание обоих, а не каждого в опции.

ответ

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 является лишь коротким путем написать то же самое, что ваш Collect.

Выбор означает, что возвращаются только те столбцы, игнорируя любые другие, более крупные.

Однако ... прежде чем вы предполагаете, что это то, что заставляет его замедляться ... вы посмотрели, огромный ли ваш стол или у вас есть нужные индексы? они также могут вызвать огромные притормаживаний ... :)

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 

Это в вашем Еврорадио вы можете использовать:

<%= f.select :acte, Acte.select_options, include_blank: true %> 
Смежные вопросы