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

时间:2018-03-20 10:33:11

标签: ruby-on-rails database search

抱歉英语不好:)

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

其中一个在标题中包含“hello”一词,另一个包含“hello”标记, 我想要显示这两个帖子,但现在只显示带有标签的那个帖子,而忽略标题中第二个带有“hello”的帖子,我不知道为什么。我知道我的Post.search方法存在问题。

请帮助我,提前谢谢!

这是我的代码:

Post.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

2 个答案:

答案 0 :(得分:1)

尝试以下

选项一

.skills_selector {
  position: relative;
}

.skills_selector a {
  position: absolute;
  top: 0;
  left: 25px;
  transform: translateY(-50%);
}

或类似的东西直接指向您的控制器索引操作

选项二

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

对于comlex搜索,您可以查看RailsCast

pg_search教程

希望它有所帮助。

答案 1 :(得分:0)

我认为这是因为“加入”。现在你有了“内连接”,当它在“标签”表中找到一行时,它会从结果中删除其余部分。所以你需要右/左连接。