[英]Rails has_many :through and Setting Property on Join model
與此問題類似,如何在此上下文中保存之前在連接模型上設置屬性?
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")
然后,創建的連接模型PostAsset
永遠不會有機會設置context
。 如何設置上下文屬性? 它看起來像這樣:
PostAsset.first #=> #<PostAsset id: 1, context: nil>
更新 :
我創建了一個測試寶石 ,試圖找出問題所在。 有沒有更簡單的方法來做到這一點?!
這個ActsAsJoinable :: Core類使得它可以在連接模型中與它們之間的上下文建立多對多的關系。 它增加了輔助方法。 基本測試基本上顯示了我正在嘗試做的事情。 關於如何正確地做這件事的任何更好的想法?
查看位於此處的ActiveRecord :: Associations :: ClassMethods API中的has_many選項: http ://rails.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#M001316
這是最有趣的一句話:
:條件
指定關聯對象必須滿足的條件才能作為WHERE SQL片段包含在內,例如authorized = 1.如果使用散列,則從關聯開始創建記錄。 has_many:posts,:conditions => {:published => true}將使用@ blog.posts.create或@ blog.posts.build創建已發布的帖子。
因此,我認為您的條件必須指定為哈希,如下所示:
class Post < ActiveRecord::Base
has_many :post_assets
has_many :featured_post_assets, :conditions => { :context => 'featured' }
has_many :assets, :through => :post_assets
has_many :featured_images, :through => :featured_post_assets,
:class_name => "Asset", :source => :asset,
end
你還應該做以下事情:
@post.featured_images.build(:title => "An asset")
代替:
@post.featured_images << Asset.create!(:title => "An Asset")
這應該調用作用域資產構建,如上面引用中所建議的那樣,將上下文字段添加到資產。 它還將在一個原子事務中同時將連接模型對象(post_asset)和資產對象保存到數據庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.