0

我有一個Transaction模型,其中from_owner是多態的,因爲交易可能來自其他幾個模型。Rails belongs_to在原始表上的條件

class Transaction < ActiveRecord::Base 
    belongs_to :from_owner, polymorphic: true 
end 

我試圖設立時from_owner_type爲特定值的特定belongs_to

belongs_to :from_person, 
      conditions: ['from_owner_type = ?', Person.name], 
      class_name: Person, 
      foreign_key: 'from_owner_id' 

我現在遇到的問題是,conditions似乎是Person而不是Transaction。所以,我得到了下面的SQL錯誤試圖調用from_personTransaction

的ActiveRecord :: StatementInvalid:SQLite3的::的SQLException:沒有這樣的列:from_owner_type:選擇 「人」 * FROM 「人」 WHERE「的人。 」。 「ID」= 1 AND(from_owner_type = '人')LIMIT 1

我想要的是from_personTransaction返回nil如果Transactionfrom_owner_typePerson,否則返回相關Person。我可以設置一個自定義的from_person方法,但我認爲這可能是一個belongs_to。我想要在CanCan條件下使用它。我正在使用Rails 3.

+0

你只是想把它當作一個單獨的方法來訪問所有者(如果它是一個Person),而不是實際上是一個單獨的關聯?在這種情況下,似乎自定義方法會比試圖彎曲'belongs_to'來做別的事情更好的選擇。是否有一個特定的原因,你不想使用自定義方法? – 2013-04-04 22:20:48

+0

我希望在CanCan中定義一個像'can:read,Transaction,from_person:{profile_id:profile.id}'這樣的能力,我認爲這需要一種關係,而不僅僅是一種方法。我想我必須用不同的方式來完成我的定義,使用範圍和塊,所以這個問題可以通過「定義實例方法」來得到最好的回答。 – 2013-04-04 22:22:38

+0

當在CanCan中設置條件散列時,需要使用數據庫列([參見CanCan wiki](https://github.com/ryanb/cancan/wiki/Defining-Abilities#hash-of-條件)),所以我懷疑你的方法可能無法正常工作。你能不能在部分條件中加上類名檢查? – 2013-04-04 22:33:00

回答

0

從您的意見,似乎這是爲了能夠建立一個CanCan規則,允許用戶:read任何Transactions,他們是所有者,正確?你應該能夠做到這一點與以下規則:

can :read, Transaction, from_owner_id: profile.id, from_owner_type: Person.name 

,哪些應該意味着你不必費心與你Transaction模型搞亂任何東西。 (我沒有測試過這個,但是理論應該是正確的,即使語法不是很完美,例如,我不確定profile.id是從哪裏來的。)

+0

Nah,還有另一層間接:'from_owner_id'不適用於'Profile',而是'Person'。所以我需要'from_owner:{profile_id:@ profile.id}'。我需要從'Transaction' =>'Person'去訪問'Person'上的'profile_id'。 – 2013-04-04 22:41:15

+0

雖然它不能與'from_owner_type'條件結合嗎?即。 'can:read,Transaction,from_owner_type:Person.name,from_owner:{profile_id:@ profile.id}'?它可能不會,只是猜測,因爲我沒有使用CanCan與我自己的多態關聯:) – 2013-04-04 23:32:54