簡體   English   中英

Rails has_many:通過和在Join模型上設置屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM