2015-05-29 51 views
3

根據documentation for ActiveRecord::Associations::ClassMethods,ActiveRecord可以自動確定一個模塊的關聯是否與另一個模型的has_onehas_many關聯相反。然而,我想確保這個檢測實際上成功了一些我不確定的關聯(例如,我有一個belongs_to,它不完全匹配其他模型的名稱,但有class_name集合)。有沒有辦法檢查inverse_of檢測是否應用於特定關聯?理想情況下,我會在項目的測試套件中添加一些內容以確保該關聯是雙向的。如何檢查ActiveRecord的inverse_of檢測是否有效?

+0

這不完全是你要求的,但你應該在關聯上設置「:inverse」選項,而不是讓Rails自動計算反比關係,如果你想在某處使用「反向」功能。 –

+0

@MaxWilliams不,你不應該。這是一個完美的配置慣例。我認爲編寫多餘的代碼不是rails的方式,即如果Rails> = 4.1的自動反轉檢測機制已經選擇了它,那麼寫一個'inverse_of'選項是沒有意義的。此外,我遇到的案例中有99%不是關於功能,而是性能提升,所以沒有槓桿作用,仍然有優勢。問題是關於是否很難確定是否已經檢測到逆。 –

+0

我認爲從可讀性/自我記錄代碼的角度來看,它有很多意義:如果選項a)保證Rails能夠做正確的事情,並且b)讓同事明白某些不尋常的事情正在發生,那麼什麼是傷害? –

回答

4

啓動軌道控制檯,然後運行:

> Rails.application.eager_load! 

> ActiveRecord::Base.descendants.each {|m| puts "=== #{m} ==="; m.reflect_on_all_associations.each {|a| puts "#{a.name} => #{a.has_inverse?}"}} 

將傾倒在一個列表與所有的車型,它們的關聯,如果知道它們的反,否則「假」,零或空字符串(基於爲什麼它是未知的。)