【问题标题】:Rails 4 + Postgresql - Joins table with 2 conditionsRails 4 + Postgresql - 以 2 个条件连接表
【发布时间】:2016-09-03 04:45:06
【问题描述】:

我需要列出InputsTranslationslanguage_id = 1 并且没有language_id = 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

【问题讨论】:

    标签: ruby-on-rails postgresql join scope


    【解决方案1】:

    所以我的解决方案就是创建一个类似的查询

    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
                       )")
    

    【讨论】:

    • 这里的问题是第二个where没用,因为如果行有language_id = 1,则不一定有language_id = 2。我认为我们需要使用子查询,但我不知道如何。
    • 您想查询所有语言 ID = 1 的翻译的输入?
    • 我需要列出与 language_id = 1 的输入相关的翻译,但没有与 language_id = 2 的输入相关的翻译
    • 没用,仍在用两种语言的翻译查询输入
    • 嗯,让我试试,试着检查我的更新,我认为它现在可以工作了
    猜你喜欢
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2018-12-06
    相关资源
    最近更新 更多