2010-07-13 77 views
12

簡而言之:我有一個外鍵屬性,並且想知道該外鍵字段的類(或引用表)是什麼。僅基於外鍵屬性的關聯的類是什麼?

語境:

給出2個表:users(id, [other fields])issues(id, user_id, assigned_to, [other fields])

這裏是我的問題的活動記錄(不相關的部分中提取)

class User < ActiveRecord::Base 
    ... 
end 
class Issue < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :assigned_user, :foreign_key => 'assigned_to', :class_name => 'User' 
    ... 
end 

我想使用戶可讀的變化記錄。例如當更改分配的用戶時,我想要得到如下信息:Assigned to is changed from Otto to Zoltan。 ActiveRecord具有功能changes這是一個很好的起點,但它只給出了參考ID-s。要翻譯成我需要通過ID讀取用戶的名稱。

對於協會:user這很容易,因爲我必須遵循約定。但如何獲取assigned_to屬性的相同信息(我想制定一個通用的解決方案)?是否有可能確定我們是否具有給定屬性的關聯?我們可以提取該關聯的類嗎?

回答

3

謝謝。以下是針對特定問題(用於學習)的最終解決方案:

def textalize_changes 
    if changed? 
     r = "" 
     changes.keys.each do |k| 
     r << "#{k.humanize} changed " 
     r << "from `#{translate(k,changes[k][0])}` " 
     r << "to `#{translate(k,changes[k][1])}`" 
     r << "<br/>" 
     end 
     r 
    end 
    end 

    def translate(attr_name, attr_value) 
    ass = self.class.reflect_on_all_associations(:belongs_to).reject{|a| attr_name != a.primary_key_name} 
    if 1 == ass.length and !attr_value.blank? 
     obj = ass[0].klass.find(attr_value) 
     obj.send(:name) 
    else 
     attr_value 
    end 
    end 
29

首先,您可以使用reflect_on_association來獲取所需關聯的元數據。然後,從它的結果(這是一個MacroReflection後代),你可以找出類:

reflection = Issue.reflect_on_association(:assigned_user) 
reflection.class # => ActiveRecord::Reflection::AssociationReflection 
reflection.class_name # => 'User' 

參考文檔herethere

+0

您的文檔鏈接無法正常工作。另外,有沒有辦法獲得完整的命名空間?像'MyModule :: User' – 2014-06-18 10:40:57

+2

啊,你可以通過reflection.klass來獲取命名空間。 – 2014-06-18 10:42:29

相關問題