2016-09-02 10 views
0

私のクライアントhas_many地域、および私の地域has_manyクライアント。 Regionmembershipsテーブルを結合します。検索メソッドでこの結合テーブルにアクセスするにはどうすればよいですか?

クライアントをフィルタリングして、自分のフォームでクリックしたregion_idを探したいとします。私はそれを私のコンソールでは動作させることができますが、私のアプリケーションでは動作させません。

次のコードは、自分のコンソールで手動でフィルタリングしようとすると動作します。私のsearch.rbモデルのfind_resultsメソッドに似た、同じメソッドが必要ですが、regionmembershipsがクライアントに接続されていると認識されないようです。

私が欲しいものを見つけコンソールコード:

results = Client.all 
results = results.where(category_id: 3) 
results = results.includes(:regionmemberships).where(“regionmemberships.region_id” => “1”) 

しかし、私は私のアプリで同じことをしようとした場合、それは私このエラースロー:

undefined local variable or method `“regionmemberships' for #<Search:0x007ffdd44e96c8> 

と言及をこのエラーには(:regionmembershipsはエラーテキストにマークされています)

def find_results 
    results = Client.order(:name) 
    results = results.where(visible: true) 
    results = results.where(category_id: category_id) if category_id.present? 
    results = results.includes(:regionmemberships).where(“regionmemberships.region_id” => “0”) 

これは私のアプリがどのように見えるかです:

モデル:

Client.rb 
has_many :regionmemberships, :dependent => :destroy 
has_many :regions, through: :regionmemberships 
belongs_to :category 

Region.rb 
has_many :regionmemberships, :dependent => :destroy 
has_many :clients, through: :regionmemberships 

Regionmembership.rb 
belongs_to :client 
belongs_to :region 

Category.rb 
has_many :clients 

私new.html.erb ビュー

new.html.erb 
<%= f.collection_select :region_id, 
Region.all, :id, :name, {include_blank: false}, 
{class: "regionclass", size: "1"} %> 

Searches_controllerで関連フォーム

def new 
    @search = Search.new 

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

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

def search_params 
    params.require(:search).permit(:category_id, :region, :regions, :regionmembership, :regionmemberships, :visible, :region_id, :pricerange1, :pricerange2, :pricerange3, :pricerange4, :pricerange5, region_ids: []) 
end 

はSearch.rb(私は私のコンソールの例のようなコードを作成する必要がある場所です - しかし、それはのように思える:存在doesntのregionmemberships /見つからない/呼ばれる)

class Search < ApplicationRecord 
    def results 
     @results ||= find_results 
    end 

private 
    def find_results 
     results = Client.order(:name) # Her skal ændres til position hvis visse clients ska 
     results = results.where(visible: true) 
     results = results.where(category_id: category_id) if category_id.present? 
     results = results.includes(:regionmemberships).where(“regionmemberships.region_id” => “1”)  
    end 
end 

誰でも助けることができます。クライアントがa:regionmemberships列に接続していることを理解するためにアプリを必要としているかのようです。ありがとう!!

+0

'includes'は、積極的なロードのためである - Railsのは、2つの個別のクエリで、その場合には、あなたの最初のクエリが協会に参加していることを行わないことを決定することができます。 'join(:regionmemberships)'や '.references(:regionsmemberships)'を連想させるようにしてください。 – Thilo

+0

ありがとう!私がジョインまたは参照に変更する必要がある場所を理解しているかどうかはわかりません。あなたは私の例を助けてくれますか?非常に高く評価! – sneglefar

+0

'results.joins(:regionmemberships).where(" regionmemberships.region_id "=>" 1 "' – Thilo

答えて

0

このコードはそれを行いました。このスレッドから助けを借りて

results = results.joins(:regionmemberships).where('regionmemberships.region_id = ?', region_id) 

Rails joins query

関連する問題