2013-04-17 75 views
0

我不確定這個問題沒有得到回答,但我不確定要搜索什麼,所以如果我要求已經回答的問題,請指出正確的方向。沒有使用ID的活動記錄協會

我有2種型號:

STOCK_SYMBOL和weight_symbol

STOCK_SYMBOL中有symbol這在weight_symbol模型

匹配commodity我怎樣才能得到一個協會工作,所以當我做STOCK_SYMBOL。 weight_symbol,我會得到weight_symbol。

我知道如何在SQL中做到這一點,但如果它不是標準的idthis_id那麼我大部分都會丟失。

編輯:從STOCK_SYMBOL

class StockSymbol < ActiveRecord::Base 
    has_many :weight_symbols, primary_key: :symbol 

    def commodity 
    "LC" # This is just an example to simplify it, there is much more to this. 
    end 
end 

class WeightSymbol < ActiveRecord::Base 
    belongs_to :stock_symbol, foreign_key: :commodity 
end 

樣本對象:

StockSymbol.last 
<#StockSymbol id: 729, symbol: "LCJ13C12500", created_at: "2013-03-15 21:50:49", updated_at: "2013-03-15 21:50:49"> 

樣本對象從weight_symbol:

WeightSymbol.first 
<#WeightSymbol id:1, weight_group_id: 1, symbol: "LC", created_at: "2010-01-05 21:13:28", updated_at: "2010-01-05 21:13:28"> 

這一設置和運行StockSymbol.last.weight_symbols.to_sql後,我得到:

"SELECT `weight_symbols`.* FROM `weight_symbols` WHERE `weight_symbols`.`stock_symbol_id` = 'LCJ13C12500'" 

編輯2:

查詢,它應該做的事(我想):

SELECT * FROM `weight_symbols` WHERE `weight_symbols`.`symbol` = 'LC'; 

查詢得到我想要的信息。

SELECT * FROM `weight_symbols` a 
JOIN `stock_symbols` b 
ON a.symbol = b.commodity 
WHERE b.symbol = 'LCJ13C12500'; 

新股票符號對象

<#StockSymbol id: 729, symbol: "LCJ13C12500", created_at: "2013-03-15 21:50:49", updated_at: "2013-03-15 21:50:49", commodity: "LC"> 

回答

2

軌道關聯方法來與選項覆蓋在關係中使用的默認密鑰。如果它是一個一對多關聯StockSymbolWeightSymbol之間,您可以使用下列內容:(如果不知道,我得到了協會的正確途徑身邊,但你應該明白我的意思)

# stock_symbol.rb 
has_many :weight_symbols, primary_key: :symbol 

# weight_symbol.rb 
belongs_to :stock_symbol, foreign_key: :commodity 

Detailed Association ReferenceAssociation Basics guid中列出了屬於每種關聯類型的所有選項和方法。


編輯:根據您的更新問題,一些額外的東西。

我對你的關聯應該如何工作有點困惑 - WeightSymbol似乎沒有commodity屬性。如果WeightSymbol與其擁有StockSymbol相匹配時weight_symbol.symbol == stock_symbol.commodity?在這種情況下,你需要設置相應的鍵:

# stock_symbol.rb 
has_many :weight_symbols, primary_key: :commodity 
# :primary_key is the field on this model whose value associated models will store in their foreign_key 

# weight_symbol.rb 
belongs_to :stock_symbol, foreign_key: :symbol 
# :foreign_key is the column on this model that should match the primary_key field in the associated model 

其次,你可以使用數據庫列只設置了軌道關聯,您不能使用的方法。如果你絕對必須使用的方法,你也可能假的關聯,例如使用類似:

# stock_symbol.rb 
def weight_symbol 
    WeightSymbol.find_by_symbol(self.commodity) 
end 

這種方法的缺點是,這是可怕的效率低下,並且會有很多重複發明輪子的參與其中。

如果您可以選擇將commodity作爲數據庫字段,那麼這可能是最佳解決方案,具體取決於它可能更改的頻率。例如,如果是從模型的當前狀態派生,你可以建立一個before_save過濾器對模型做任何處理需要做的,寫適當的值到該字段:

# stock_symbol.rb 
before_save :set_commodity 

def set_commodity 
    commodity = "LC" # arrived at through whatever processing you do 
    self.commodity = commodity 
end 
+0

我想,和它沒有工作。我可能有什麼問題。我沒有考慮它,但商品是一種方法,而不是一個專欄。我希望仍然有辦法做到這一點。我添加了所有我認爲可能對問題有所幫助的東西。 –

+0

似乎有幾個問題基於此,以及您的更新問題。我已經更新了我的答案。 –

+0

我更新了數據庫並添加了商品作爲列(我不知道爲什麼我之前沒有這樣做,因爲它實際上是靜態信息,所以非常感謝)。我仍然得到相同的SQL輸出。我正在用SQL格式更新我想要的原始問題。我對此不夠了解,以便真正瞭解我做錯了什麼。我閱讀了您列出的網頁,但他們似乎沒有向我展示我正在嘗試做的事情的正確範例。 –