![](/img/trans.png)
[英]What is the most efficient way to query on columns in belongs_to association in Rails 3?
[英]Rails-y way to query a model with a belongs_to association
我有兩個型號:
class Wine
belongs_to :region
end
class Region
has_many :wines
end
我試圖使用#where方法,通過將params哈希中的某些元素轉換為查詢哈希來構建哈希,例如{ :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
而不是錯誤。
問題如下:
是否有使用#where
方法中的id
查詢Wine
對象的特定regions
的rails-y方法? 根據我所知道的,我列出了以下一些選項。
選項1:我可以改變構建查詢哈希的方式,以便每個字段都有_id
(如{ :region_id => '1234', :varietal_id => '1515' }
但不是Wine
所有關聯都是belongs_to
和因此沒有為_id
葡萄酒的條目,使得邏輯更加復雜的連接和什么不是。
選項2:構建一個SQL where子句,再次使用一些邏輯來確定是否對另一個表使用id或join ...再次邏輯會更復雜一些,並且深入研究SQL會讓它感覺更少rails-y。 或者我在那方面可能是錯的。
選項3..n:我沒想過的事情......你的輸入就在這里:)
您可以在Wine模型中設置一個范圍,使其更具軌道性...
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')
感謝所有回復的人。 我得到的答案對於單個條件查詢非常有用,但我需要能夠處理不同條件的東西。
我最終實現了我的選項#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 }
我們會看到這是多么可持續,但這就是我現在所用的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.