2014-11-12 4 views
3

Я использую Ransack с Rails 3.Gem Ransack не возвращает результаты, когда искали с полным именем

Мои взгляды:

<%= search_form_for @search do |f| %> 
    <%= f.text_field :first_name_or_last_name_or_company_cont, :style => 'width:150px;padding-top:6px;' %><p class="button"> 
    <%= f.submit "Search by name or company" %></p> 
    <% end %> 

Моя схема:

create_table "users", :force => true do |t| 
    t.string "first_name",     
    t.string "last_name" 

на Модель пользователя У меня есть:

def full_name 
    "#{self.first_name} #{self.last_name}" 
    end 

Wor король на консоли.

Если у меня есть пользователь с first_name = "Foo", last_name = "Bar", при поиске с одним из них, я получаю результаты как ожидалось.

Когда я искал full_name = "Foo Bar", я не получаю результатов.

Я попытался изменить свою text_field для рыскать в:

<%= f.text_field :first_name_or_last_name_or_company_or_full_name_cont 

я first_name_or_last_name_or_company_or_full_name_cont is undefined

есть быстрый способ решить эту проблему без добавления другого столбца для FULL_NAME на столе пользователей?

также:

 7: def index 
    8: search_params = params[:q] 
=> 9: binding.pry 

[1] pry(#<UsersController>)> search_params 
=> {"first_name_or_last_name_or_company_cont"=>"Foo Bar"} 

Я думаю, я могу разделить значение ключа здесь искать только первое имя.

ответ

6

Вы должны использовать Ransacker. Добавьте это в вашей User модели:

ransacker :full_name do |parent| 
    Arel::Nodes::InfixOperation.new('||', 
    parent.table[:first_name], parent.table[:last_name]) 
end 

Вы можете проверить Ransack GitHub wiki на другие примеры.

+0

удивительный! спасибо – neo

+1

Спасибо, что назовите меня в правильном направлении. Ваш пример не работал с mysql. Я последовал вашей ссылке и попробовал пример, который действительно сработал. То есть: ransacker: full_name do | parent | Arel :: Nodes :: NamedFunction.new ('concat_ws', ['', parent.table [: first_name], parent.table [: last_name]]) end – curt

+0

Вы используете mysql? потому что я попробовал то же самое и не повезло. –

0

Добавьте следующий код модели:

ransacker :full_name do |parent| 
    Arel::Nodes::InfixOperation.new('||', 
    Arel::Nodes::InfixOperation.new('||', 
     parent.table[:first_name], Arel::Nodes.build_quoted(' ') 
    ), 
    parent.table[:last_name] 
) 
end 

... и следующий на ваш взгляд:

<%= f.label :full_name %><br> 
<%= f.search_field :full_name_cont %> 

грабитель часть была взята из Ransack wiki.

Протестировано на Rails 4.2 с PostgreSQL.

+0

Пожалуйста, не отправляйте [идентичные ответы] (http://stackoverflow.com/a/41898820/4174897) на несколько вопросов. Отправьте один хороший ответ, затем проголосовате/отметьте, чтобы закрыть другие вопросы как дубликаты. Если вопрос не является дубликатом, * приложите свои ответы на вопрос. * –

+0

@Kyll: Извините. Я сделал то, что ты предложил. – BrunoFacca

Смежные вопросы