私のクライアント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列に接続していることを理解するためにアプリを必要としているかのようです。ありがとう!!
'includes'は、積極的なロードのためである - Railsのは、2つの個別のクエリで、その場合には、あなたの最初のクエリが協会に参加していることを行わないことを決定することができます。 'join(:regionmemberships)'や '.references(:regionsmemberships)'を連想させるようにしてください。 – Thilo
ありがとう!私がジョインまたは参照に変更する必要がある場所を理解しているかどうかはわかりません。あなたは私の例を助けてくれますか?非常に高く評価! – sneglefar
'results.joins(:regionmemberships).where(" regionmemberships.region_id "=>" 1 "' – Thilo