【问题标题】:Ruby on Rails search function solutionsRuby on Rails 搜索功能解决方案
【发布时间】:2017-09-02 00:03:44
【问题描述】:

我是 Ruby on Rails 的新手,所以我对我的搜索功能有几个问题。

搜索视图:

<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

索引视图:

  <% @stud.each do |student_arr|%>
  <% student_arr.each do |student| %>
  <li> <%= student.prename + " " + student.lastname + " " + student._format_birthday + " DaZ: " + student.daz.to_s%>
  (<%= link_to "Details", action: "detail", id: student.id %>)
  (<%= link_to "Edit", action: "edit", id: student.id %>) </li>
 <% end %>
 <% end %>

我的解决方案有效,我没有重复,但代码看起来很糟糕,我不得不说“寻找前或姓氏”。愿任何人都可以帮助我更好的解决方案。 对我来说,如果您只是在寻找学生并且您不必说出您正在寻找的内容(前名或姓氏)并且您没有重复,那将是完美的。也许学生的名字是“彼得彼得”(不好的例子,但它可能会发生^^),所以我只想在我的学生数组中得到彼得一次。此外,我希望可以选择搜索一个明确的名字,所以如果有学生叫“Hans-Peter”,学生叫“Hans”,但我只想找到“Hans”...... 有没有办法用越来越漂亮的代码来解决这个问题?

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

【问题讨论】:

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


    【解决方案1】:

    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
    

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

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

    【讨论】:

    • 哇!十分感谢!我使用了您的解决方案,并且效果很好:) 名称的第一个字母是否大写都没关系,这非常棒。 “#{column_name} ILIKE :search”这一行只有一个问题。我不得不使用 LIKE 而不是 ILIKE。可能是因为我使用 SQLite3?我不确定。
    • @homior 是的,我忘了提到使用的数据库:postgreSQL 使用 ILIKE,MySQL 和 SQLite 使用 LIKE。我很高兴我的代码帮助了你,最重要的是你理解逻辑并且可以重现它!用 Rails 玩得开心:)
    • 我不确定这个“end.join(' OR ')”到底在做什么。我知道 sql_conditions 将是“prename LIKE :search OR lastname LIKE :search”。所以如果你使用这个“end.join('OR')”,它会添加一个'OR',每次他通过循环时,除了最后一次? (再次抱歉英语^^)
    猜你喜欢
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2011-01-03
    • 2014-06-26
    • 2021-10-30
    • 2012-07-21
    相关资源
    最近更新 更多