2016-11-14 4 views
0

Я делаю внутреннее соединение (по крайней мере, я думаю, что это то, что делает код), но мой поиск возвращает один и тот же результат несколько раз. Я думаю, что у меня что-то не так с моим соединением.Rails Search возвращает duplicate

Теги

+------------+--------------+------+-----+---------+----------------+ 
| 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. Существует также .uniq alias, начиная с рельсов 4.0.2.

Пример:

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