Ruby on rails Rails查找带有多个标记的记录|未定义方法';其中';用于阵列

Ruby on rails Rails查找带有多个标记的记录|未定义方法';其中';用于阵列,ruby-on-rails,ruby,tags,Ruby On Rails,Ruby,Tags,所以我想建立一个作业板,包含可标记的作业。 我想自己实现它,所以我遵循了本教程: 所有的工作,但我想得到的不仅是所有的工作是一个标签(教程有一个方法,为标签与(名称)),而是我想得到所有的工作是与多个标签标签 因此,我在job.rb模型中添加了一个方法,如下所示: def self.tagged_with_tags(tags) jobs = [] tags.each do |tag| Jobtag.where(name: tag).first.jobs.map

所以我想建立一个作业板,包含可标记的作业。 我想自己实现它,所以我遵循了本教程:

所有的工作,但我想得到的不仅是所有的工作是一个标签(教程有一个方法,为
标签与(名称)
),而是我想得到所有的工作是与多个标签标签

因此,我在
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')
这里我得到了一个错误:
未定义的方法“where”for#


以下是我的模型:

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
class Jobtag < ActiveRecord::Base
    has_many :taggings
    has_many :jobs, through: :taggings
end
class Tagging < ActiveRecord::Base
    belongs_to :job
    belongs_to :jobtag
end
类作业
Jobtag.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
class Jobtag < ActiveRecord::Base
    has_many :taggings
    has_many :jobs, through: :taggings
end
class Tagging < ActiveRecord::Base
    belongs_to :job
    belongs_to :jobtag
end
class作业标签
标记.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
class Jobtag < ActiveRecord::Base
    has_many :taggings
    has_many :jobs, through: :taggings
end
class Tagging < ActiveRecord::Base
    belongs_to :job
    belongs_to :jobtag
end
类标记
使用
。其中
需要有一个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')

要使用
。其中
您需要有一个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')

希望有帮助

使用活动记录联接查询可以获得所需的结果。 迭代每个作业对象并将其推送到数组的效率较低

@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')

希望有帮助

你不能调用数组类上的
where
子句。是的,但我如何在可以调用它的位置获取作业集合?你不能调用数组类上的
where
子句。是的,但我如何在可以调用它的位置获取作业集合?嗯,我不确定,它有点有效,不得不将
:job_tags
更改为
jobtags
,但我认为问题是我从@tags数组中获得了所有带有任意一个标记的作业,但我只想获得同时具有两个@tags的作业,这不是你的问题。另外,您尝试的方法(self.tagged_with_tags(tags))不会给出同时包含两个标记的作业结果。更新你的问题。那么,我怎么才能找到只有两个@tags的工作结果呢?哦,我想它现在真的可以正常工作了,有两个同名的标签。。。非常感谢。嗯,我不确定,它是否有效,必须将
:job_tags
更改为
jobtags
,但我认为问题是,我从@tags数组中获得所有带有任意一个标记的作业,但我只想获得同时具有@tags的作业,这不是你的问题。另外,您尝试的方法(self.tagged_with_tags(tags))不会给出同时包含两个标记的作业结果。更新你的问题。那么,我怎么才能找到只有两个@tags的工作结果呢?哦,我想它现在真的可以正常工作了,有两个同名的标签。。。非常感谢。