代码之家  ›  专栏  ›  技术社区  ›  xpnimi

Rails查找带有多个标记的记录|数组的未定义方法“where”

  •  0
  • xpnimi  · 技术社区  · 6 年前

    所以我想建立一个工作板,上面有可标记的工作。 我想自己实现它,所以我遵循了本教程: 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>


    以下是我的模型:

    工作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
    

    工作标签。rb型

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

    标记。rb型

    class Tagging < ActiveRecord::Base
        belongs_to :job
        belongs_to :jobtag
    end
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Ashik Salman    6 年前

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

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

    类似这样:

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

    使现代化

    如果要获取包含@标记数组中列出的所有标记的作业,请检查同一查询中的jobtags计数。

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

    希望有帮助!

        2
  •  1
  •   Snake    6 年前

    使用 .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')