【问题标题】:How do I get all posts that belong to a post type? Rails如何获取属于某个帖子类型的所有帖子?导轨
【发布时间】:2014-09-23 04:08:49
【问题描述】:

我有两个模型:

class PostType < ActiveRecord::Base
  extend FriendlyId
  friendly_id :name, use: [:slugged, :finders, :history]

  belongs_to :blog
  belongs_to :post

  validates :name, presence: true

end

class Post < ActiveRecord::Base
  extend FriendlyId
  friendly_id :title, use: [:slugged, :finders, :history]

  belongs_to :blog
  belongs_to :user

  has_and_belongs_to_many :tags, join_table: 'tags_posts', :dependent => :destroy
  has_and_belongs_to_many :categories, join_table: 'categories_posts', :dependent => :destroy
  has_many :comments, :dependent => :destroy

  validates :title, presence: true

  before_save :set_default_post_type

  ...

  private

  def set_default_post_type
    if self.post_type_id == nil
      post_type_object = PostType.find_by(name: 'post')
      self.post_type_id = post_type_object.id
    end
  end

end

如您所见,帖子属于博客,帖子类型属于博客和帖子。创建帖子时,默认帖子类型为 1(该特定代码将被清理)

所以我的问题是,我该如何建立这样的关系才能做到:

PostType.find(1).posts.all

现在我可以Blog.find(1).posts.all,因为博客有很多帖子,帖子属于博客,而帖子有一个 post_type,而 post_types 可以属于很多帖子。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    试试:

    Post.where('post_types.id = ?', some_id).joins(:post_types)
    

    你可以在 PostType 中创建一个方法:

    def posts
      Post.where('post_types.id = ?', id).joins(:post_types)
    end
    

    【讨论】:

    • references 应与includes 一起使用
    • 我觉得这是错误的。就像我应该能够通过关系做到这一点。请参阅博客有许多帖子属于博客。所以我可以做Blogs.find(x).posts.all 并且帖子类型属于帖子,因为帖子只能在帖子类型上具有。所以我应该能够做类似PostType.find(x).posts.all 之类的事情吗?为什么我必须做一个.where 和一个.references? (顺便说一句……但是……仍然有效。
    • 该表结构没有关系,如果您想要 PostType has_many/has_and_belongs_to_many Posts 之类的帖子,则需要分别使用 post_type_id 或连接表 posts_post_types 发布。
    • 您可以做的是更改表结构以使用单表继承(STI),并添加索引。你会对那个选项感兴趣吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多