2016-11-14 83 views
0

我正在做一个内部连接(至少我认为这就是代码的工作),但我的搜索多次返回相同的结果。我想我的加入有问题。Rails搜索返回重复

标签

+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| name  | varchar(255) | YES |  | NULL |    | 
| color  | varchar(255) | YES |  | NULL |    | 
| article_id | int(11)  | YES | MUL | NULL |    | 
| created_at | datetime  | NO |  | NULL |    | 
| updated_at | datetime  | NO |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 

文章

+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| title  | varchar(255) | YES |  | NULL |    | 
| info  | text   | YES |  | NULL |    | 
| created_at | datetime  | NO |  | NULL |    | 
| updated_at | datetime  | NO |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 

每篇文章我已标记,并返回一个基于标签的多个结果。因此,如果文章有3个标签,则会返回3条记录。即使每篇文章只应该有1个返回?

class Article < ApplicationRecord 
    has_many :tags, dependent: :destroy 
    validates :title, presence: true 

    def self.search(search) 
    if search 
    joins(:tags).where('title LIKE :search OR tags.name LIKE :search', search: "%#{search}%") 
    else 
    all 
    end 
end 
end 

回答

1

使用.distinct或.group。从rails 4.0.2开始,还有.uniq别名。

例子:

joins(:tags).where('title LIKE :search OR tags.name LIKE :search', search: "%#{search}%").distinct 

joins(:tags).where('title LIKE :search OR tags.name LIKE :search', search: "%#{search}%"). 
group('article_id') 
+0

惊人......我放置之前不同而没有得到地方。你是最好的。 :d – trowse