Rails has_many:通过和在Join模型上设置属性

与此问题类似,如何在此上下文中保存之前在连接模型上设置属性?

class Post  :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  :post_assets end 

我只想做到这一点:

 @post = Post.create!(:title => "A Post") @post.featured_images < "An Asset") # ... @post = Post.first @featured = @post.featured_images.first #=> # @featured.current_post_asset #=> # 

那会怎么样? 我整天都在敲打它:)。

目前发生的是当我这样做时:

 @post.featured_images < "An Asset") 

然后,创建的连接模型PostAsset永远不会有机会设置context 。 如何设置上下文属性? 它看起来像这样:

 PostAsset.first #=> # 

更新

我创建了一个测试gem ,试图找出问题所在。 有更简单的方法吗?!

这个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创建已发布的post。

因此,我认为您的条件必须指定为哈希,如下所示:

 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") 

这应该调用范围资产构建,如上面引用中所建议的那样,将上下文字段添加到资产。 它还将在一个primefaces事务中同时将连接模型对象(post_asset)和资产对象保存到数据库。