2015-10-30 95 views
4

我想要的是:對於給定的外鍵名稱和模型類,我可以獲得關聯(知道可以解析哪種模型)。從外鍵獲取rails關聯?

例如:

# model: product.rb 
class Product < ActiveRecord::Base 
    belongs_to :category 
end 

# resolution: 
association = Product.get_association('category_id') 

所以我需要這個get_association功能。

我現在知道什麼:

  1. 從Product.reflections我能得到反射/協會
  2. 一個反射的名單,我可以得到外鍵
  3. 我可以建立一個地圖這個外鍵,得到聯想

但是,我想問一下是否有一個簡單的方法可以直接調用?

更新:我真的需要

我執行使用auditaudit log視圖。然而,當我試圖輸出審計日誌,我可以得到的是這樣的:

supplier_id: changed from '1' to '0' 

我希望與供應商的實際名稱來代替數字,因此,我認爲如果給supplier_id,我應該能夠得到Supplier模型。

另外,因爲我用這樣的:

belongs_to :reporter, class_name: 'User' 

我因此不能簡單地猜測從給定鍵的類名。

+0

嘿,你的實際需求是什麼?,這個解釋有點混亂。請詳細說明。 –

+0

@Bharatsoni用例更新:) – songyy

+0

@songyy,你找到解決方案嗎? – Fivell

回答

3

您正在尋找reflect_on_association

Product.reflect_on_association(:category)

編輯:不要使用反映*在這裏。

TL;博士:Log類名稱,並使用.find


如果你的模型看起來像

class Employee 
    belongs_to :manager, foreign_key: :manager_id 
end 

class Manager 
    has_many :subordinates, foreign_key: :manager_id, class_name: 'Employee' 
end 

和日誌文件說是這樣的:manager_id: changed from '1' to '2',已改變模型會Employee,因爲它有列manager_id。但是沒有辦法從你的問題的例子日誌中得出結論,因爲由於不止一個模型可以有列manager_id,所以不可能得到明確的答案。但在這種簡單情況下,我們知道相關模型爲Manager,而日誌中的數字可以用名稱替換:Manager.find(1),Manager.find(2)。這裏不需要反射魔法。


想想這種情況下:

class Employee 
    belongs_to :manager, foreign_key: :department_id, class_name: 'Manager' 
end 

class Responsibility 
    belongs_to :manager, foreign_key: :organizer_id, class_name: 'Manager' 
    belongs_to :department, foreign_key: :department_id, class_name: 'Department' 
end 

class Manager 
    has_many :subordinates, foreign_key: :organizer_id, class_name: 'Employee' 
    has_many :obligations, foreign_key: :organizer_id, class_name: 'Responsibility' 
end 

class Department 
    has_many :obligations, foreign_key: :department_id, class_name: 'Responsibility' 
end 

如果您的日誌只包含department_id: changed from '1' to '2'你無法知道究竟已經在你的公司已經改變。

要解決此問題,您必須記錄關聯模型的類名(不是已更改的模型)。如果你有班級名稱,這裏不需要任何反思,那就像第一個簡單例子那樣,它只是一個.find

+2

感謝您的信息。但似乎我只能調用'Product.reflect_on_association(:category)';調用'Product.reflect_on_association(:category_id)'會返回一個'nil' – songyy

+0

你是對的。修復它的答案。如果你只有包含'_id'部分的字符串,你可以使用'.sub!(/ _ id $ /,'')'將其刪除。 –

+1

嗯,但有時外國人可能不是'[association_name] _id',因爲我實際上可以設置外鍵:'has_many:下屬,class_name:「Employee」, foreign_key:「manager_id」' – songyy