Направляющие has_many: через и Свойство Установки на модели Join

Подобный этому вопросу, как я устанавливаю свойство на модели соединения незадолго до, сохраняют в этом контексте?

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:: Базовый класс делает его так, у Вас могут быть многие ко многим отношениям с контекстом между ними в модели соединения. И это добавляет вспомогательные методы. Базовые тесты показывают в основном, что я пытаюсь сделать. Какие-либо лучшие идеи о том, как сделать это правильно?

9
задан Community 23 May 2017 в 12:25
поделиться

1 ответ

Посмотрите на параметры 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), так и объект актива в базе данных одновременно в одной атомарной транзакции.

1
ответ дан 5 December 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: