从关联模型回调中访问所​​有模型

时间:2015-01-23 12:27:46

标签: ruby-on-rails ruby-on-rails-4

我有一个带回调的问题模型:

class Question < ActiveRecord::Base
  has_many :qtags
  has_many :tags, through: :qtags

  after_save { self.tags.find_or_create(self) }
end

这会将问题传递给Tag,Tag应该从tag_list

创建一些标签

在tag.rb中,我想访问所有标签以检查是否已存在:

class Tag < ActiveRecord::Base
  has_many :qtags
  has_many :questions, through: :qtags

  def self.find_or_create(question)
    question.tags.destroy_all
    question.tag_list.split(' ').each do |tag|
      # Tag.where here can't access all the tags, just the associated ones.
      if Tag.where(name: tag).exists? && question.tags.ids.exclude?(Tag.where(name: tag).first.id)
        question.tags << Tag.where(name: tag)
      elsif Tag.where(name: tag).blank?
        question.tags << Tag.create(name: tag)
      end
    end
  end
end

但是,这只会检查具有相关问题ID的标签。

所以,当我添加一个带有binding.pry的pry控制台时:

     5: def self.find_or_create(question)
     6:   question.tags.destroy_all
 =>  7:   binding.pry
     8:   question.tag_list.split(' ').each do |tag|
     9:     if Tag.where(name: tag).exists? && question.tags.ids.exclude?(Tag.where(name: tag).first.id)
    10:       question.tags << Tag.where(name: tag)
    11:     elsif Tag.where(name: tag).blank?
    12:       question.tags << Tag.create(name: tag)
    13:     end
    14:   end
    15: end

[1] pry(Tag)> Tag.all
  Tag Load (0.1ms)  SELECT "tags".* FROM "tags" INNER JOIN "qtags" ON "tags"."id" = "qtags"."tag_id" WHERE "qtags"."question_id" = ?  [["question_id", 11]]

它仅选择带有相关问题ID的标签。

如何使用Tag.all或Tag.where(..)访问所有标签,而不仅仅是哪些标签有问候ID?

1 个答案:

答案 0 :(得分:0)

我无法解决问题,但我这样解决了这个问题:

我没有使用回调,而是从控制器调用了find_or_create方法,如下所示:

  def create
    Tag.find_or_create(@question) if @question.save
    respond_with(@question)
  end

修改

现在我看到错误是什么:

  after_save { self.tags.find_or_create(self) }

这应该是:

  after_save { Tag.find_or_create(self) }