Rails находит записи с несколькими тегами | неопределенный метод 'where' для массива

Итак, я хочу создать доску вакансий с вакансиями, которые можно тегировать. Я хочу реализовать это сам, поэтому я последовал этому руководству: https://www.sitepoint.com/tagging-scratch-rails/

все работает, но я хочу получить не только все задания, помеченные одним тегом (в руководстве есть метод для этого tagged_with(name)), но вместо этого я хочу получить все задания, помеченные несколькими тегами.

Итак, я добавил метод к модели job.rb следующим образом:

def self.tagged_with_tags(tags)
    jobs = []
    tags.each do |tag|
        Jobtag.where(name: tag).first.jobs.map do |j|
            jobs.push(j) unless jobs.include?(j)
            puts j
        end
    end
    jobs
end

Кажется, это работает, но я хочу дополнительно запросить возвращенный массив, например:

@jobs = Job.tagged_with_tags(@tags).where(category: 'Full-Budget').order('created_at desc')

И вот я получаю эту ошибку: undefined method 'where' for #<Array:0x007fb1b0a25c10>


Вот мои модели:

job.rb

class Job < ActiveRecord::Base
    has_many :taggings
    has_many :jobtags, through: :taggings

    def all_jobtags=(names)
        self.jobtags = names.split(",").map do |name|
            Jobtag.where(name: name.strip.downcase).first_or_create!
        end
    end

    def all_jobtags
        self.jobtags.map(&:name).join(", ")
    end

    def self.tagged_with(name)
        Jobtag.find_by_name!(name.downcase).jobs
    end

    # Needs work:
    def self.tagged_with_tags(tags)
        jobs = []
        tags.each do |tag|
            Jobtag.where(name: tag).first.jobs.map do |j|
                jobs.push(j) unless jobs.include?(j)
                puts j
            end
        end
        jobs
    end

end

Jobtag.rb

class Jobtag < ActiveRecord::Base
    has_many :taggings
    has_many :jobs, through: :taggings
end

Tagging.rb

class Tagging < ActiveRecord::Base
    belongs_to :job
    belongs_to :jobtag
end

Вы не можете вызвать предложение where для класса массива.

Ashik Salman 11.04.2018 11:59

да, но как мне получить коллекцию вакансий, где я могу это назвать?

xpnimi 11.04.2018 12:02
0
2
698
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Для использования .where у вас должна быть коллекция ActiveRecord.

Job.joins(:job_tags).where("jobs_tags: { name: "name of tag or array of tag names").where(category: 'Full-Budget').order('created_at desc')
Ответ принят как подходящий

Вы можете получить желаемый результат с помощью активного запроса на объединение записей. Итерация по каждому объекту задания и отправка его в массив менее эффективна.

@tags = ['tag_name1', 'tag_name2']

Что-то вроде этого:

@jobs = Job.joins(:jobtags).where(jobtags: { name: @tags }).
          where(category: 'Full-Budget').
          order('created_at desc')

Обновлять

Если вы хотите получить задания, все теги которых указаны в массиве @tags, проверьте количество тегов заданий в том же запросе.

@jobs = Job.joins(:jobtags).where(jobtags: { name: @tags }).
          group('jobs.id').
          having('count(jobs.id) = ?', @tags.size).
          where(category: 'Full-Budget').
          order('created_at desc')

Надеюсь, поможет !

Хммм, я не уверен, это вроде работает, пришлось заменить :job_tags на jobtags, но я думаю, что проблема в том, что я получаю все задания с любым тегом из массива @tags, но я хочу получить только задания, у которых есть оба @tags

xpnimi 11.04.2018 12:29

Это был не твой вопрос. Также метод (self.tagged_with_tags (tags)), который вы пробовали, не даст результатов работы, в которой есть оба тега. Обновите свой вопрос.

Ashik Salman 11.04.2018 12:59

Итак, как мне найти только результаты вакансий, в которых есть только оба тега @?

xpnimi 11.04.2018 14:45

О, я думаю, теперь он действительно работает, как и предполагалось, имел два тега с одинаковыми именами ... Спасибо !!!

xpnimi 11.04.2018 15:02

Другие вопросы по теме