Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 按记录关联的Rails查询_Ruby On Rails_Serialization_Ruby On Rails 3.2_Rails Activerecord - Fatal编程技术网

Ruby on rails 按记录关联的Rails查询

Ruby on rails 按记录关联的Rails查询,ruby-on-rails,serialization,ruby-on-rails-3.2,rails-activerecord,Ruby On Rails,Serialization,Ruby On Rails 3.2,Rails Activerecord,我对Rails比较陌生,为了了解更多信息,我尝试创建一个简单的博客。我遇到的一个问题是标记。我有一个标签模型,我用它来创建和管理可以应用于帖子的标签。我还有一个模特儿。我需要能够将任何标记与帖子相关联,检索它们以进行输出,并且能够通过特定标记过滤/查询帖子 到目前为止,我已经在Post上创建了一个名为tags的列,它被分配了一个标记id数组,然后被序列化。这对于检索来说非常有用,但我的理解是,尝试通过序列化列查询记录是一种困难 正如上面的链接所建议的,我这样做是为了实现我的过滤器: Post.a

我对Rails比较陌生,为了了解更多信息,我尝试创建一个简单的博客。我遇到的一个问题是标记。我有一个标签模型,我用它来创建和管理可以应用于帖子的标签。我还有一个模特儿。我需要能够将任何标记与帖子相关联,检索它们以进行输出,并且能够通过特定标记过滤/查询帖子

到目前为止,我已经在Post上创建了一个名为tags的列,它被分配了一个标记id数组,然后被序列化。这对于检索来说非常有用,但我的理解是,尝试通过序列化列查询记录是一种困难

正如上面的链接所建议的,我这样做是为了实现我的过滤器:

Post.all.select { |post| post.tags.include? 3 }
但我知道这是在收集我所有的帖子,然后使用数组方法select过滤它们


我的问题是:如何将任意数量的标记记录与Post记录关联,并根据给定的标记查询/过滤Post记录?

因此,假设您的模型如下所示:

class Post < ActiveRecord::Base
  has_many :taggings
  has_many :tags, through: :taggings
end

class Taggings < ActiveRecord::Base
  belongs_to :post
  belongs_to :tag
end

class Tag < ActiveRecord::Base
  has_many :taggings
  has_many :posts, through: :taggings
end
请记住,这里的标记是我们在模型中声明的关系的名称,而不是实际的基础表。所以这实际上要做的是运行SQL

select * from posts
inner join taggings on taggings.post_id = posts.id
inner join tags on taggings.tag_id = tag.id
where tags.name = 'foo';

由于我们已经声明了这些表在模型中是如何关联的,rails知道它必须连接到一起才能用上面的代码查询标记。

很抱歉花了这么长时间。工作完美!非常感谢。
Post.joins(:tags).where(tags: { name: 'foo' })
select * from posts
inner join taggings on taggings.post_id = posts.id
inner join tags on taggings.tag_id = tag.id
where tags.name = 'foo';