轨道按标题,正文和标签搜索帖子



对不起,英语:)不好

我在应用程序中遇到了问题。我想按帖子标题、帖子文本及其标签实现帖子搜索,我有一个搜索表单,我希望显示标题或文本或标签中包含此单词的所有帖子,但现在它的工作方式不同,例如,我有 2 个帖子:

其中一个在标题中包含单词"hello",另一个具有标签"hello",我希望显示这两个帖子,但现在只显示带有标签的帖子,而标题中带有"hello"一词的第二个帖子被忽略,我不知道为什么。我知道我的Post.search方法有问题。

请帮帮我,提前谢谢!

这是我的代码:

帖子.rb:

class Post < ApplicationRecord
  mount_uploader :image, ImageUploader
  validates :body, presence: true, length: { maximum: 500}
  validates :title, presence: true, length: { maximum: 50}
  validates :adress, length: { maximum: 50}
  belongs_to :user
  has_many :taggings
  has_many :tags, through: :taggings
  has_many :comments, dependent: :destroy
  has_many :favorites, dependent: :destroy
  def self.search(keywords)
      if keywords
        joins(:tags).where("lower (title) ILIKE :value OR 
                            lower (body) ILIKE :value OR  
                            lower (tags.name) ILIKE :value", 
                            value: "%#{keywords.downcase}%")
      else
        all.order("created_at DESC")
      end
  end
end

后控制器索引操作:

def index
  @posts = Post.search(params[:keywords]).uniq
end

尝试以下操作

选项一

Post.includes(:tags).where("lower (posts.title) ILIKE :value OR 
                       lower (posts.body) ILIKE :value OR 
                       lower (tags.name) LIKE :value", 
                       value: "%#{params[:keywords].downcase}%" ).references(:tags)

或者类似的东西直接到你的控制器索引操作

备选方案二

def index
    if params[:keywords].present?
        @posts = Post.includes(:tags).where("lower (posts.title) ILIKE :value OR 
                                             lower (posts.body) ILIKE :value OR 
                                             lower (tags.name) LIKE :value", 
                                             value: "%#{params[:keywords].downcase}%" ).references(:tags)
    else
        @posts = Post.all.order(created_at: :DESC)
    end
end

备选方案三

def index
    if params[:keywords].present?
        @posts = Post.where('true')
        @posts = @posts.where('lower (title) ILIKE' => "%#{params[:keywords]}%")
        @posts = @posts.where('lower (body) ILIKE' => "%#{params[:keywords]}%")
        @posts = @posts.includes(:tags).where('lower (tags.name)' => "%#{params[:keywords]}%")
        @posts = @posts.order(created_at: :DESC).uniq
    else
        @posts = Post.all.order(created_at: :DESC)
    end
end

对于 comlex 搜索,您可以查看此RailsCast教程pg_search

希望对您有所帮助。

我认为这是因为"连接"。现在你有"内部连接",当它命中"标签"表中的一行时,它会从结果中删除其余部分。因此,您需要右/左连接。

最新更新