Ruby on Rails搜索功能解决方案

时间:2017-04-06 19:16:39

标签: ruby-on-rails ruby search ruby-on-rails-5

我是Ruby on Rails的新手,因此我对搜索功能提出了几个问题。

搜索视图:

([0-9999])([A-Z])([0-9999])[-]([0-99])

控制器:

<p>
<%= form_tag students_path, :method => 'get' do %>
<p> Advanced_search: <%= check_box_tag "advanced_search", value = "1" %> </P>
<%= select_tag(:attribute, options_for_select([['Prename',0],['Lastname',1]])) %>
<%= text_field_tag :search%>
<%= submit_tag "Search"%></p>

型号:

def index
    @stud = Student.search(params[:search], params[:advanced_search], params[:attribute])
end

索引视图:

def self.search(search, advanced_search, attribute)
    ary = []
    if advanced_search
        case attribute
        when '0'
            ary << Array(where(Student.arel_table[:prename].matches("%#{search}%")))
        when '1'
            ary << Array(where(Student.arel_table[:lastname].matches("%#{search}%")))
        else
            raise ArgumentError, 'Something strange happened! problem with select_tag in the search function'
        end
    elsif search
        case attribute
        when '0'
            ary << Array(where(prename: search))
        when '1'
            ary << Array(where(lastname: search))
        else
            raise ArgumentError, 'Something strange happened! problem with select_tag in the search function'
        end
    else
        Student.all
    end
    ary
end

我的解决方案有效,我没有重复,但代码看起来非常糟糕,我不得不说“寻找pre-or lastname”。愿任何人都能帮助我找到更好的解决方案。 对我来说,如果你只是在寻找一个学生,而你不必说出你正在寻找的东西(前名或姓名)而且你没有得到重复,那将是完美的。也许学生的名字是“Peter Peter”(不好的例子,但它可能会发生^^),所以我只想在我的Student_array中得到Peter一次。此外,我想有选择搜索一个明确的名字,所以如果有学生叫“汉斯 - 彼得”,学生叫“汉斯”,但我只是想找到“汉斯”...... 有没有办法用更少和更漂亮的代码来实现这个问题?

感谢您的帮助,抱歉我的英语不好......我正在尽我所能:) 再见

1 个答案:

答案 0 :(得分:0)

IMO,您的代码需要一个完整的重构器。这是帮助您重构搜索逻辑的基础:

# student.rb
def self.search(searched_string)
  searchable_columns = %w( prename lastname )
  sql_conditions = searchable_columns.map do |column_name|
    "#{column_name} ILIKE :searched_string"
    # use ILIKE if you are using PostgreSQL
    # use LIKE if you are using MySQL or SQLite
  end.join(' OR ')
  where(sql_conditions, searched_string: "%#{searched_string}%")
end

将返回任何包含搜索到的字符串的名字或姓氏的学生记录。

您必须相应地更改控制器对搜索方法的调用。