2009-08-31 48 views
0

嗯,我不知道我是否完全錯誤,但我真的找不到一個非常實用而直接的方法來做這樣的事情:rails model:has_many with self arguments(NOT association)

class User < ActiveRecord::Base 

has_many :creations 

end 

但事情是,我只是希望用戶有很多的作品,如果user.developer ==真 其中user.developer只是用戶表內的布爾字段。

因此,有什麼想法可以直接從模型做到?

恢復,當用戶如果試圖得到User.first.creations不是開發商,User.first.creations.new ......創造... ...銷燬等你得到NoMethodError但是如果它是開發人員您可以構建一個新的創作。

我設法做到這一點是擴展模型和擴展檢查,如果proxy_owner.developer ==真但這樣做,我不得不重寫所有的行動,新的創建,更新等的唯一途徑...

任何幫助將不勝感激 非常感謝

回答

2

如何爲用戶劃分子類並只在開發人員子類中指定has_many?然後開發人員將從用戶中挑選任何邏輯,並且用戶不會有任何創建。

class User < ActiveRecord::Base 
end 

class Developer < User 
    has_many :creations 
end 
+0

這真的是這樣做的方式。經典的應該在繼承中建模的行爲示例。 您需要快速閱讀導軌STI以瞭解如何設置它,它非常簡單。然後你也可以開始做類似Developer.find_blah的事情。 – dalyons 2009-09-01 06:49:39

+0

感謝那些夥伴,事實上我之前做過這個'優秀'的想法,在我的應用中使用較少的模型。我認爲沒有必要爲此創建一個新模型,因爲它非常簡單,所以我開始改變我的觀點。但正如我所看到的,我可能不得不回到這個想法。但有一點可以肯定的是,真正令人感興趣的是,除了創建一個新模型之外,沒有簡單的方法來說:「好吧,我只是希望這個模型有一定的優勢:如果這個模型有這個可能性,那麼這個模型就會失敗」。 – zanona 2009-09-01 08:19:44

+0

我試過這個(http://pastebin.com/f3eb450a3)它在第一次調用時工作,但在第一次生成has_many:apps之後,它將它附加到類中,所以您再也無法覆蓋它了。 但是,感謝您的幫助,非常感謝 – zanona 2009-09-01 08:23:35

0

包括這可能工作。如果不是,你可能不得不求助於alias_method_chain,但是我聽說它與嚴重的有組織犯罪有關,所以要留意自己。

module CreationsJustForDevelopers 
    def creations(*args) 
    if developer? 
     super 
    else 
     raise NoMethodError, "Only developers get creations." 
    end 
    end 
end 

不知道你指的是與重寫新的所有談話內容,創建,更新等等,但唯一的其他方法我能想到的去除是creation_ids,但誰在乎呢?

+0

感謝這cwninja它真的打開了我的想法,實現一個不同的方式。但不幸的是,似乎mixin沒有重寫** has_many:creations **方法,所以它不會生效。可能我做錯了什麼。 我試圖在** has_many之後聲明創作函數:創作**,並且它的工作是在其開發人員和開發人員何時開發人員以及開發人員何時開發?我收到以下內容:** NoMethodError:超級:沒有超類方法'創作'** 我會盡量不斷嘗試從中獲得一些結果, 感謝您的幫助:) – zanona 2009-09-01 00:29:42

+0

Jared的答案仍然是整潔的,除非因爲某種原因你被迫這樣做。 沒有超類的方法可能是由於您在關聯設置之前包含模塊。嘗試將它移動到'has_many:creations'之後。 – cwninja 2009-09-01 08:26:32

+0

是的,我真的注意到cwninja。可能我會暫時離開,直到獲得更多的調整軌道內部體驗。 但是,非常感謝您的幫助 – zanona 2009-09-02 17:43:37