2016-05-08 1 views
1

мне нужно перечислить Inputs, которые имеют Translations с language_id = 1и не имеют Перевод с language_id = 2Rails 4 + PostGreSQL - присоединяется стол с 2-мя условиями

Мой текущий объем составляет:

scope :language, -> (id){joins(:translations).where('translations.language_id = 1)} 

Модели:

class Input < ActiveRecord::Base 
    has_many :translations 
    has_many :languages, through: :translations 
    scope :language, -> (id) {joins(:translations).where('translations.language_id = 1')} 

    def translation_from_language(language) 
    self.translations.where(language: language).take 
    end 
end 

class Translation < ActiveRecord::Base 
    belongs_to :input 
    belongs_to :language 
    before_save :default_values 

    #Apenas para testar o scope de search 
    scope :search, -> (part) { where("LOWER(value) LIKE ?", "%#{part.downcase}%") } 

    # Se nao setar um input manualmente, irá criar um novo 
    def default_values 
    self.input ||= Input.create 
    end 
end 

class Language < ActiveRecord::Base 
    has_many :translations 
    has_many :inputs, through: :translations 
end 

ответ

2

Таким образом, мое решение просто создает запрос типа

Input.where("id IN (SELECT input_id 
        FROM translations 
        WHERE language_id = 1 
        ) 
      AND id NOT IN (
        SELECT input_id 
        FROM translations 
        WHERE language_id = 2 
        )") 
+0

Проблема здесь состоит в том, что второй, где бесполезно, потому что, если строка есть LANGUAGE_ID = 1, necesseraly не имеем LANGUAGE_ID = 2. Я думаю, что мы должны использовать подзапросы, но я не знаю, как. –

+0

Вы хотите запросить вход со всеми трансалиями, у которых есть language_id = 1? –

+0

Мне нужно перечислить Входы, которые имеют переводы, связанные с вводом с помощью language_id = 1, но не имеют переводов, связанных с вводом с language_id = 2 –