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的工作结果呢?哦,我想它现在真的可以正常工作了,有两个同名的标签。。。非常感谢。