2015-09-26 65 views
1

我是Active Record的新手,儘管讀了很多文檔,但我找不到一種方法來執行此操作。我知道這不是處理事情的正確方法,理想情況下,下面的映射邏輯應該存在於另一個表中,但現在這似乎是處理它的最簡單方法。在Active Record中使用示波器的方法

我在數據庫中有以下信息,我想以特殊方式檢索它。我有:

| locations | value | 
|----------------|-------| 
|  brazil  | 20 | 
|  europe  | 30 | 
| restoftheworld | 35 | 

我想要一個自定義的getter方法或範圍,檢查並找到適當的條目。類似於這樣的僞代碼:

def findbylocation(location) 
    if location exists 
    return row 
    elsif location.in_eu? 
    return row of 'europe' 
    else 
    return row of 'restoftheworld' 
end 

寫這個的最好方法是什麼?這是範圍還是方法?

注意:我使用https://github.com/hexorx/countries進行歐盟檢查,所以這裏沒有問題。

+0

爲什麼不使用散列,而不是數組?那麼你將不需要一種方法。 – Santhosh

+0

它不是一個數組,它們是數據庫行。我編輯了這個問題來說清楚。 – gok

+0

那麼'歐洲'和'restoftheworld'是不同的表格,還是所有的表格? –

回答

1

這取決於。如果你想在內存中進行區域驗證,就像你在問題的僞代碼中寫的一樣,你必須使用class method(或者instance method,這取決於你將如何使用它)。例如,如果您對where子句進行區域驗證,則應使用scope方法。

這是因爲scope返回ActiveRecord::Relation,因此您可以鏈接更多'範圍'方法。如果更改範圍的返回類型對象,則會失去鏈式能力,這是毫無意義的。

我有點困惑,你想如何使用findbylocation方法,以及它如何表現。無論如何,我強烈建議您閱讀this article,這很好地解釋了rails中的scopesmethods之間的區別。

+0

謝謝@丹尼爾的信息。文章特別有助於理解範圍和方法。我解決了它。 – gok

-1

首先,示波器方法。

它們本質上只是Rails方法的簡寫。


我是新來的ActiveRecord

好了,所以我覺得你有一個問題,因爲你的表結構是不正確的。

ActiveRecord爲我們提供了associations的強大功能。這是一個抽象層,可用於在表中創建關係,使您無需調用100多個查詢即可執行查找。

#app/models/location.rb 
class Location < ActiveRecord::Base 
    has_many :cities #-> you can replace "city" with anything here 
    scope :findbylocation, ->(continent) { find_by(name: continent) } 
end 

#app/models/city.rb 
class City < ActiveRecord::Base 
    #columns id | location_id | name | etc | created_at | updated_at 
    belongs_to :location 
end 

這給你打電話以下的能力:

@location = Location.find_by name: "europe" 

@location = Location.findbylocation "europe" 

這將填充@location對象,然後您就可以調用以下:

@location.cities.each do |city| 
    city.name #-> Bangalore 

你必須理解關係數據庫的能力,尤其是當你建立多個對象:

enter image description here

我相信你的問題是你沒有正確的模塊化數據。 IE瀏覽器將所有內容放到「位置」數據表中,當你真的需要將位置作爲一個表格,並且城市(或其他)。

這樣,你並不想立刻看到一切;你會發現你需要的具體位置記錄,通過ActiveRecord通過它提取相關數據。

+0

感謝@豐富的啄,我知道關係數據庫的力量,但我認爲在我的情況下把每個國家放在一個單獨的表中並不是真的有必要。我真的需要三到四個不同的位置,但因爲這些位置與地理邊界(例如歐洲)相連,我需要一種方法來定義邏輯。 – gok

-1

好吧,我解決了它。我不確定這是否是最好的方法。如果您知道更好的解決方案,請隨時改進或提出其他建議。我創建了以下方法:

def self.by_location(location) 
    if LocationValue.exists?(:location => location) 
    where(location: location) 
    elsif location.in_eu? 
    where(location: 'europe') 
    else 
    where(location: 'restoftheworld') 
    end 
end 
相關問題