Lan*_*ard 9 join ruby-on-rails associations
与此问题类似,如何在此上下文中保存之前在连接模型上设置属性?
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
Run Code Online (Sandbox Code Playgroud)
我只是希望能够做到这一点:
@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">
Run Code Online (Sandbox Code Playgroud)
那会怎么样?我整天都在敲打它:).
目前发生的是当我这样做时:
@post.featured_images << Asset.create!(:title => "An Asset")
Run Code Online (Sandbox Code Playgroud)
然后PostAsset,创建的连接模型永远不会有机会设置context.如何设置上下文属性?它看起来像这样:
PostAsset.first #=> #<PostAsset id: 1, context: nil>
Run Code Online (Sandbox Code Playgroud)
更新:
我创建了一个测试宝石,试图找出问题所在.有更简单的方法吗?!
这个ActsAsJoinable :: Core类使得它可以在连接模型中与它们之间的上下文建立多对多的关系.它增加了辅助方法.基本测试基本上显示了我正在尝试做的事情.关于如何正确地做这件事的任何更好的想法?
查看位于此处的 ActiveRecord::Associations::ClassMethods API 中的 has_many 选项:http://rails.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#M001316
这是最有趣的引用:
:状况
指定关联对象必须满足的条件才能作为 WHERE SQL 片段包含在内,例如授权 = 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
Run Code Online (Sandbox Code Playgroud)
并且您还应该执行以下操作:
@post.featured_images.build(:title => "An asset")
Run Code Online (Sandbox Code Playgroud)
代替:
@post.featured_images << Asset.create!(:title => "An Asset")
Run Code Online (Sandbox Code Playgroud)
这应该调用范围资产构建,如上面引用中所建议的,将上下文字段添加到资产中。它还会在一个原子事务中同时将连接模型对象 (post_asset) 和资产对象保存到数据库中。
| 归档时间: |
|
| 查看次数: |
4425 次 |
| 最近记录: |