对不起,英语:)不好
我在应用程序中遇到了问题。我想按帖子标题、帖子文本及其标签实现帖子搜索,我有一个搜索表单,我希望显示标题或文本或标签中包含此单词的所有帖子,但现在它的工作方式不同,例如,我有 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
希望对您有所帮助。
我认为这是因为"连接"。现在你有"内部连接",当它命中"标签"表中的一行时,它会从结果中删除其余部分。因此,您需要右/左连接。