加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 从高级搜索表单保存搜索选项

发布时间:2020-12-16 21:03:17 所属栏目:百科 来源:网络整理
导读:我有一个高级搜索表单,我想向用户提供一个保存选项的选项.我怎么能做到这一点? 用户应该能够填写高级搜索表单的选项,然后单击“保存此搜索”链接,该链接将存储他们的选项.有了这个,每个用户都将拥有自定义的默认搜索选项,因此每次访问时都不需要重新输入详
我有一个高级搜索表单,我想向用户提供一个保存选项的选项.我怎么能做到这一点?

用户应该能够填写高级搜索表单的选项,然后单击“保存此搜索”链接,该链接将存储他们的选项.有了这个,每个用户都将拥有自定义的默认搜索选项,因此每次访问时都不需要重新输入详细信息.

我认为这对未来很多人都有帮助.

搜索控制器:

def new
    @search = Search.new
    render layout: 'new_application'
  end

  def create
    @search = Search.new(params[:search])
    if @search.save
        redirect_to @search
    else
      render 'new'
    end
  end

  def show
    @user = current_user
    @search = Search.find(params[:id])
    @users = @search.users
    render 'users/index',layout: 'new_application'    
  end

  def update
    @search = Search.find(params[:id])
    if @search.update_attributes(params[:search])
        redirect_to @search
    else
      render 'new'
    end
  end

  def index
    if location = Location.find_by_zipcode(params[:search])
        latitude  = location.latitude * Math::PI / 180 
        longitude = location.longitude * Math::PI / 180 

        locations = Location.search( 
          :geo   => [latitude,longitude],:with  => {:geodist => 0.0..600_000.0},:order => 'geodist ASC',:per_page => 5_000
        ) 
        @users = User.where(zip_code: locations.map(&:zipcode))


          else
            @users = User.search(params[:search])
        end      
      end

  def min_age
    @min_age = params[:min_age].to_i.years
  end

  def max_age
    @max_age = params[:max_age].to_i.years
  end

  def youngest_age
  @youngest_age = params[:youngest_age].years
  end

  def oldest_age
  @oldest_age = params[:oldest_age].years
   end
end

搜索模型:

def users
    @users ||= find_users
  end

    private

    def find_users
      users = User.order(:id)
      users = users.where(gender: gender) if gender.present?
      users = users.where(zip_code: zip_code) if zip_code.present?
      users = users.where(children: children) if children.present?
      users = users.where(religion: religion) if religion.present?
      users = users.where(ethnicity: ethnicity) if ethnicity.present?

      if min_age.present? && max_age.present?
        min = [ min_age,max_age ].min
        max = [ min_age,max_age ].max
        min_date = Date.today - min.years
        max_date = Date.today - max.years
        users = users.where("birthday BETWEEN ? AND ?",max_date,min_date)
        users
      end
      users
    end
  end

搜索表单:

a.adv_search href="#" 
    = image_tag "adv_link.png"
    span Advanced Search
  = form_for @search do |f|
    .form_container
      .row
        .col
          label I am a
          select.large
            option Female
            option Male
        .select2
          .col.col2
            label Seeking
            = f.select :gender,%w(Female Male)
        .select1
          .col.col3
            label Ages
            = f.select :min_age,options_for_select((18..50),25),{},{class: 'small'}
        .select5
          .col.col4
            label to
            = f.select :max_age,options_for_select((20..50),45),{class: 'small'}
      .row
        .col.col5
          label Near
          = f.text_field :zip_code,placeholder: "enter zip here",class: 'text_input'
        .col.col6
          = f.select :children,['I want kids now','I want one someday'],prompt: 'child preference'

        .select4
          .col.col6
            = f.select :religion,['Agnostic','Atheist','Christian','Catholic','Buddhist','Hindu','Jewish','Muslim','Spiritual without affiliation','Other','None','Prefer not to say'],prompt: 'Religion'
        .select4
          .col.col7
            = f.select :ethnicity,['Asian','Biracial','Indian','Hispanic/Latin','Middle Eastern','Native American','Pacific Islander','White','Other'],prompt: 'Ethnicity'
      .btm_sec
        ul.form_list
          li
            a href="#" 
              = image_tag "form_icon1.png"
              span.color Save this Search
          li
            a href="#" 
              = image_tag "form_icon2.png"
              span Load
          li
            a href="#" 
              = image_tag "form_icon3.png"
              span Reset
        input.find_btn type="submit" value="Find" /
    .btm_search_detail

解决方法

如果您不想将它们存储在模型中,最好的方法是存储在序列化哈希中.我已经为一个应用程序做了这个,我需要管理员来保存他们的偏好/设置.我尝试了很多宝石,最后我使用了 rails-settings.

即,在您的用户模型中,您可以执行以下操作:

class User < ActiveRecord::Base
  has_settings do |s|
    s.key :search_options,:defaults => { :gender => 'male'}
  end
end

然后设置/保存设置,您可以执行以下操作:

user.settings(:search_options).gender = 'female'
user.save!

我喜欢这种方法的是它具有较低的占地面积,如果你开始看到可扩展性问题,那么很容易将其剥离并实现完整的优化模型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读