【发布时间】:2011-03-06 03:16:44
【问题描述】:
类似于this question,如何在此上下文中保存之前在连接模型上设置属性?
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>
更新:
我创建了一个测试gem 来尝试隔离问题。有更简单的方法吗?!
这个ActsAsJoinable::Core class 使得您可以在连接模型中建立多对多关系以及它们之间的上下文。它添加了辅助方法。基本的tests 基本上显示了我正在尝试做的事情。有关如何正确执行此操作的任何更好的想法?
【问题讨论】:
-
这似乎也与我本周早些时候的问题相似:stackoverflow.com/questions/3035064/… 我只是追溯更改了联接模型。但是,我认为必须有一个回调才能在保存连接模型之前对其进行处理。 +1 因为我很好奇。
-
在非连接模型上有一个
before_add和after_add回调(所以在帖子上是assets),但是如果不调用@,你就无法真正访问连接模型987654335@。在阅读了所有论坛之后,它似乎是 Rails 中缺少的功能。
标签: ruby-on-rails associations join