簡體   English   中英

Rails-y查詢具有belongs_to關聯的模型的方法

[英]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" =...

當然, winesregion_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM