0

Rails メソッドの find_by_name は知っていますが、名前の代わりにオブジェクトがある場合はどうなるでしょうか? @car私がオブジェクトを持っていると仮定し@brandます。特定のオブジェクトcarsを持つすべてを検索するにはどうすればよいですか。brand

何かのようなもの@cars = Car.find_by_brand(@brand)

私は試し@cars = @brand.carsましたが、それは1つの親モデルしか引っ張っていないようです。

編集 - コードの詳細

車のコントローラー:

has_and_belongs_to_many :brands

ブランドモデル:

  attr_accessible :name
  has_and_belongs_to_many :cars

ブランドコントローラー

def create
@car = Car.find(params[:car_id])
@brand = Brand.create
@brand.assign_attributes({ :name => params[:brand][:brands][:name] })
@brand.cars << @car
if @brand.save
  redirect_to @car
else
  flash[:notice] = "Error!"
  redirect_to @car
end
end

def findcars
    @brand = Brand.find_by_name(params[:brand_name])
    @cars = @brand.cars
end

意見

<%= link_to brand.name, findcars_car_brand_path(@car, brand_name: brand.name), method: "get" %>

ルート

resources :cars do    
    resources :brands do
        member { get :findcars }
    end
end

テーブル- 結合テーブルのモデルがありません

brands (name:string)

cars (name:string)

brands_cars (brand_id:integer, car_id:integer)

4

1 に答える 1

1

最初にfindcarsを見てみましょう。.joins(:brands)は、Carオブジェクトの作成中に、ブランド条件( 'brands.attribute' => brand_value )を介してクエリを絞り込むことができるため重要です。

SQLは次のようになります。

SELECT "cars".* FROM "cars" INNER JOIN "cars_brands" ON "cars_brands"."car_id" = "cars"."id" INNER JOIN "brands" ON "brands"."id" = "cars_brands"."brand_id" WHERE "brands"."id" = 1

そしてこのような実装:

# If all you care about is the @cars - as the method name indicates
def findcars
    @cars = Car.joins(:brands).where('brands.name' => params[:brand_name])
end
# If you need both variables
def findcars
    @brand = Brand.find_by_name(params[:brand_name])
    @cars = Car.joins(:brands).where('brands.id' => @brand)
end

結合がない場合、SQLは次のようになります。

SELECT "cars".* FROM "cars" WHERE "brands"."id" = 1

「ブランド」はこの文脈では何も意味しないため、これは壊れます。クエリを適切に作成できるように、レールにもう少し詳細を指定する必要があります。

次に、createメソッドを作成します。

# @brand = Brand.create
# @brand.assign_attributes({ :name => params[:brand][:brands][:name] })
# params[:brand][:brands][:name] indicates something fishy with your form
# since this form is in the context of Brand, params[:name] should suffice 
@brand = Brand.create(:name => params[:brand][:brands][:name])

redirect_to @carは、フォームが自動車中心のフォームであることを意味しますか?正しいコンテキストで*form_for*を使用すると、オブジェクトの作成が簡単になります。

2つの優れた概要については、以下を確認してください。

  1. http://guides.rubyonrails.org/active_record_querying.html
  2. http://guides.rubyonrails.org/association_basics.html
于 2013-02-20T20:05:34.613 に答える