與this question類似,如何在保存在此上下文之前在連接模型上設置屬性?Rails has_many:通過和設置加入屬性模型
class Post < ActiveRecord::Base
has_many :post_assets
has_many :assets, :through => :post_assets
has_many :featured_images, :through => :post_assets, :class_name => "Asset", :source => :asset, :conditions => ['post_assets.context = ?', "featured"]
end
class PostAssets < ActiveRecord::Base
belongs_to :post
belongs_to :asset
# context is so we know the scope or role
# the join plays
validates_presences_of :context
end
class Asset < ActiveRecord::Base
has_many :post_assets
has_many :posts, :through => :post_assets
end
我只是希望能夠做到這一點:
@post = Post.create!(:title => "A Post")
@post.featured_images << Asset.create!(:title => "An Asset")
# ...
@post = Post.first
@featured = @post.featured_images.first
#=> #<Asset id: 1, title: "An Asset">
@featured.current_post_asset #=> #<PostAsset id: 1, context: "featured">
如何將這項工作?我整天都在叮叮叮叮咚叨叨着:)。
目前發生的是當我這樣做:
@post.featured_images << Asset.create!(:title => "An Asset")
然後加入時生成從來沒有得到一個機會來設置context
模型PostAsset
。我如何設置上下文屬性?它看起來像這樣:
PostAsset.first #=> #<PostAsset id: 1, context: nil>
更新:
我創建了一個測試gem,試圖找出問題。有沒有更簡單的方法來做到這一點?!
這ActsAsJoinable::Core class使它可以在聯接模型中與它們之間的上下文有多對多的關係。它增加了輔助方法。基本tests顯示我正在嘗試做什麼。任何更好的想法如何正確地做到這一點?
這也似乎類似於本星期早些時候我的問題: http://stackoverflow.com/questions/3035064/updating-extra-attributes-in-a-has-many-through-relationship-using-rails 我只是追溯地改變連接模型。然而,我認爲必須有回調才能在聯接模型保存前處理聯接模型。 +1',因爲我很好奇。 – Robbie 2010-06-21 02:40:31
在非連接模型上有'before_add'和'after_add'回調(所以Post上的'assets'),但是如果不調用PostAsset.first(:conditions = > {...})'。在閱讀所有論壇後,它似乎是Rails中的一個缺失功能。 – 2010-06-21 03:42:14