我是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一次。此外,我想有选择搜索一个明确的名字,所以如果有学生叫“汉斯 - 彼得”,学生叫“汉斯”,但我只是想找到“汉斯”...... 有没有办法用更少和更漂亮的代码来实现这个问题?
感谢您的帮助,抱歉我的英语不好......我正在尽我所能:) 再见
答案 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
将返回任何包含搜索到的字符串的名字或姓氏的学生记录。
您必须相应地更改控制器对搜索方法的调用。