2

私は2つのモデルを持っています:

class Wine
  belongs_to :region
end

class Region
  has_many :wines
end

たとえば、特定の要素を params ハッシュからクエリ ハッシュに変換して構築されたハッシュで #where メソッドを使用しようとしています。{ :region => '2452' }

def index
  ...
  @wines = Wine.where(hash)
  ...
end

しかし、クエリの実行時に列が存在しないというエラーが表示されるだけです。

ActiveRecord::StatementInvalid: PGError: ERROR:  column wines.region does not exist
LINE 1: SELECT "wines".* FROM "wines"  WHERE "wines"."region" =...

もちろん、テーブルwinesにはregion_idあるので、代わりにクエリを実行してregion_idもエラーは発生しません。

質問は次のとおりです。

メソッドでを使用してWine特定のオブジェクトをクエリする Rails-y の方法はありますか? 私ができることを知っていることに基づいて、いくつかのオプションを以下にリストしました。regionsid#where

オプション 1: クエリ ハッシュを作成する方法を変更して、各フィールドが持つように_idすること{ :region_id => '1234', :varietal_id => '1515' }ができます。いいえ。Winebelongs_to_id

オプション 2: SQL の where 句を作成します。ここでも何らかのロジックを使用して、id を使用するか、別のテーブルに対して結合するかを決定します。ロジックはやや複雑になり、SQL を掘り下げると、レールのように感じにくくなります。または、その面で間違っている可能性があります。

オプション 3..n: 私が考えていないこと... あなたの入力はここに入ります :)

4

2 に答える 2

8

Wine モデルにスコープを設定して、より Rails-y にすることができます...

class Wine < ActiveRecord::Base

  belongs_to :region
  attr_accessible :name, :region_id

  scope :from_region, lambda { |region|
    joins(:region).where(:region_id => region.id)
  }
end

したがって、次のようなことができます。

region = Region.find_by_name('France')
wine =   Wine.from_region(region)

編集1:

または、本当に派手にしたい場合は、複数のリージョンのスコープを実行できます。

scope :from_regions, lambda { |regions|
  joins(:region).where("region_id in (?)", regions.select(:id))
}

regions = Region.where("name in (?)", ['France','Spain']) # or however you want to select them
wines =   Wine.from_regions(regions) 

編集2:

必要に応じて、スコープと where 句をチェーンすることもできます。

regions = Region.where("name in (?)", ['France','Spain'])
wines =   Wine.from_regions(regions).where(:varietal_id => '1515')
于 2012-11-29T15:12:54.373 に答える
0

返信してくれたすべての人に感謝します。私が得た答えは、単一の条件クエリには最適ですが、さまざまな数の条件を処理できるものが必要でした.

私はオプション#1を実装することになりました。これは_id、値を反復して連結することにより条件ハッシュを構築することでした。

def query_conditions_hash(conditions)
  conditions.inject({}) do |hash, (k,v)| 
    k = (k.to_s + "_id").to_sym
    hash[k] = v.to_i
    hash
  end
end

そのため、メソッドは次のように params から構築されたハッシュを取得します。

{ region => '1235', varietal => '1551', product_attribute => '9' }

を各キーの末尾にドロップし_id、値を整数に変更します。

{ region_id => 1235, varietal_id => 1551, product_attribute_id => 9 }

これがどれほど持続可能かはこれからわか​​りますが、これが私が今行ったものです.

于 2012-12-05T03:48:53.187 に答える