我有一个带回调的问题模型:
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?
答案 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) }