2015-01-23 3 views
0

У меня есть модель Вопрос с обратным вызовом:Доступ ко всем модель из связанных моделей обратного вызова

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

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

Это проходит вопрос Tag, который должен создать несколько тегов из tag_list

В tag.rb I хотел бы получить доступ ко всем тегам, чтобы проверить, если один уже существует:

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 

Однако это только проверяет, в тегах, которые имеют соответствующий идентификатор вопросов.

так, когда я добавить консоль монтировки с binding.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]] 

Он выбирает только тег с соответствующими вопросами идами.

Как я могу получить доступ ко всем тегам с Tag.all или Tag.where (..), которые не имеют идентификатор вызывающего абонента?

+0

Где такое 'имя тега? –

+0

question.tag_list получает разделение на tag_names, но qustion - это то, почему Tag.all вызывается с идентификатором вопросов, например: [question.id, 11], почему я не могу получить доступ ко всем тегам? –

+0

Прошу прощения, я не понимаю. Можете ли вы добавить свой код на свой вопрос? Части, которые вы заменили на «...», например. –

ответ

0

я не мог решить эту проблему, но я удосужился это так:

Вместо того, чтобы использовать функцию обратного вызова я назвал find_or_create метод из контроллера так:

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

Edit:

Теперь я понимаю, что была ошибка:

after_save { self.tags.find_or_create(self) } 

Это должно быть:

after_save { Tag.find_or_create(self) } 
Смежные вопросы