2014-04-26 35 views
-1

我需要模仿標準的Rails has_many關係,但將外鍵存儲在父項中。如何使用has_many關係在父項中存儲外鍵

class Product < ActiveRecord::Base 
    has_many :questions 
end 

class Question < ActiveRecord::Base 
    belongs_to :product 
end 

這是因爲我使用PaperTrail的版本,當我取回@product的早期版本,我想看看有什麼問題,它與相關的。

到目前爲止,我想創造的:

  • ,更新問題 的序列化陣列的關聯回調IDS每次問題是添加或刪除從 @ product.questions時間
  • :讀取這個數組,把它變成一個 收集的問題

喜歡的東西的方法

class Product < ActiveRecord::Base 

    serialize :questions_list, Array 

    has_many :questions, :after_add => :update_questions_list, :after_remove => :update_questions_list 

    def update_questions_list 
    update_column :questions_list, questions.map{|q| q.id} 
    end 

    def versioned_questions 
    questions_list.map{|id| Question.find(id)} 
    end 

end 

然後,我會專門在我的其他方法中引用versioned_questions。

但是,這似乎有點駭人聽聞,可能是瓶頸的來源。如果可能的話,我希望自己做一些Railsish,我會自動獲得ActiveRecord協會的所有好處。我可以嗎?

順便說一句,有a StackOverflow question,從它的標題看來它回答我的問題,但它實際上涉及到has_one協會,而不是has_many

+0

我想你已經downvoted,因爲這違背了Rails的慣例 - 或許downvoter會詳細說一下它對於? –

回答

1

最終的答案,使用Rails爲PostgreSQL的陣列列類型questions_list 4的支持,是:

class Product < ActiveRecord::Base 

    has_many :questions, :after_add => :add_to_questions_list, :after_remove => :remove_from_questions_list 

    def add_to_questions_list(question) 
    update_attribute :questions_list, questions_list << question.id 
    end 

    def remove_from_questions_list(question) 
    update_attribute :questions_list, questions_list.reject{|i| i == question.id} 
    end 

    def versioned_questions 
    questions_list.map{|id| Question.find(id)} 
    end 

end