Подобный этому вопросу, как я устанавливаю свойство на модели соединения незадолго до, сохраняют в этом контексте?
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
#=> #
@featured.current_post_asset #=> #
Как это работало бы? Я ударял по голове по всему этому день :).
То, что в настоящее время происходит, - когда я делаю это:
@post.featured_images << Asset.create!(:title => "An Asset")
Затем модель соединения PostAsset
это создается, никогда не получает шанс установить context
. Как я устанавливаю то свойство контекста? Это похоже на это:
PostAsset.first #=> #
Обновление:
Я создал тестовый драгоценный камень, чтобы попытаться изолировать проблему. Существует ли более легкий способ сделать это?!
Этот ActsAsJoinable:: Базовый класс делает его так, у Вас могут быть многие ко многим отношениям с контекстом между ними в модели соединения. И это добавляет вспомогательные методы. Базовые тесты показывают в основном, что я пытаюсь сделать. Какие-либо лучшие идеи о том, как сделать это правильно?
Посмотрите на параметры has_many в API ActiveRecord :: Associations :: ClassMethods, расположенном здесь: http://rails.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html # M001316
Это самая интересная цитата:
: conditions
Укажите условия, которым должен соответствовать связанный объект, чтобы его можно было включить как фрагмент 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), так и объект актива в базе данных одновременно в одной атомарной транзакции.