简体   繁体   English

在rails上仅搜索current_users记录中的ruby

[英]search ruby on rails only for the current_users records

I have an advanced search page with a seperate search controller for my contracts. 我有一个高级搜索页面,带有用于合同的单独搜索控制器。

My search is working fine but is searching ALL records, i only want it to search records associated with the current user. 我的搜索工作正常,但是正在搜索所有记录,我只希望它搜索与当前用户关联的记录。

I am using Devise. 我正在使用Devise。

Below is my search.rb 以下是我的search.rb

class Search < ActiveRecord::Base

     def search_contracts
    contracts = Contract.all

    contracts = contracts.where(user_id: current_user)
    contracts = contracts.joins(:tenant).where(["tenants.first_name LIKE ? OR tenants.last_name LIKE ?", "%#{keywords}%", "%#{keywords}%"]) if keywords.present?
    contracts = contracts.where(["balance >= ?", min_balance]) if min_balance.present?
    contracts = contracts.where(["balance <= ?", max_balance]) if max_balance.present?
    contracts = contracts.where(["unpaid_rent LIKE ?", unpaid_rent]) if unpaid_rent.present?

    return contracts
  end

end

Here is my search_controller.rb 这是我的search_controller.rb

class SearchesController < ApplicationController

def new
  @search = Search.new
end

def create
  @search = Search.create!(search_params)
  redirect_to @search
end

def show
  @search = Search.find(params[:id])
end


private

def search_params
    params.require(:search).permit(:keywords, :min_balance, :max_balance, :unpaid_rent)
end

end

show page for search results 显示搜索结果页面

.wrapper_with_padding
  #houses.clearfix
    - unless @search.user_search_contracts.blank?
      - @search.user_search_contracts.each do |contract|
        %a{ href: (url_for [contract])}
          .house
            %p.end_of_contract= contract.end_of_contract
            %p.balance= number_to_currency(contract.balance, :unit => "£", negative_format: "(%u%n)")
            -if contract.tenant.present?
              %p.tenant_id= contract.tenant.full_name
            -else
              %p No Tenant Assigned
            -if contract.house.present?
              %p.house_id= contract.house.full_house_name
            -else
              %p No Property Assigned

    - else
      %h2 Add a Contract
      %p It appears you have not added any contracts

    %button= link_to "New Contract", new_contract_path
    = link_to "Advanced Search", new_search_path

You could do a class method to your Search model. 您可以对您的搜索模型执行类方法。

class Search < ActiveRecord::Base
  def self.user_search_contracts(user)
    user ||= User.new
    contracts = Contract.where(user_id: user.id)

    contracts = contracts.joins(:tenant).where(["tenants.first_name LIKE ? OR tenants.last_name LIKE ?", "%#{keywords}%", "%#{keywords}%"]) if keywords.present?
    contracts = contracts.where(["balance >= ?", min_balance]) if min_balance.present?
    contracts = contracts.where(["balance <= ?", max_balance]) if max_balance.present?
    contracts = contracts.where(["unpaid_rent LIKE ?", unpaid_rent]) if unpaid_rent.present?

    return contracts
  end
end

Although, I wouldn't implement this Search functionality in this way, but ... 虽然,我不会以这种方式实现此搜索功能,但是...

Try modifying what @DR7 posted, only create an instance method, not a class method. 尝试修改@ DR7发布的内容,仅创建实例方法,而不创建类方法。

class Search < ActiveRecord::Base
  def user_search_contracts(user)
    contracts = Contract.where(user_id: user.id)

    contracts = contracts.joins(:tenant).where(["tenants.first_name LIKE ? OR tenants.last_name LIKE ?", "%#{keywords}%", "%#{keywords}%"]) if keywords.present?
    contracts = contracts.where(["balance >= ?", min_balance]) if min_balance.present?
    contracts = contracts.where(["balance <= ?", max_balance]) if max_balance.present?
    contracts = contracts.where(["unpaid_rent LIKE ?", unpaid_rent]) if unpaid_rent.present?

    return contracts
  end
end

And inside your view -> 在您的视图内->

.wrapper_with_padding
  #houses.clearfix
    - unless @search.user_search_contracts(current_user).blank?
      - @search.user_search_contracts(current_user).each do |contract|
        %a{ href: (url_for [contract])}
          .house
            %p.end_of_contract= contract.end_of_contract
            %p.balance= number_to_currency(contract.balance, :unit => "£", negative_format: "(%u%n)")
            -if contract.tenant.present?
              %p.tenant_id= contract.tenant.full_name
            -else
              %p No Tenant Assigned
            -if contract.house.present?
              %p.house_id= contract.house.full_house_name
            -else
              %p No Property Assigned

    - else
      %h2 Add a Contract
      %p It appears you have not added any contracts

    %button= link_to "New Contract", new_contract_path
    = link_to "Advanced Search", new_search_path

Class methods vs. Instance methods 类方法与实例方法

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM