Rails 5 присоединяется к фильтру, связанному - PullRequest
0 голосов
/ 12 октября 2018

Как я могу использовать объединения для запроса связанной модели в рельсах 5?Я попробовал DoctorLocation.joins(:location).where(:location => {:confidence => 2}) после просмотра документации и этого вопроса .Что я делаю неправильно?Мой запрос не возвращает никаких результатов.

pry(main)> DoctorLocation.joins(:locations).where(:locations => {:confidence => 2})
=> #<DoctorLocation::ActiveRecord_Relation:0x3ff735a09d8c>

class DoctorLocation
   belongs_to :location

end

class Location
   has_many :doctor_locations, dependent: :destroy

end

Миграция

   create_table :doctor_locations do |t|
      t.integer :doctor_profile_id
      t.integer :location_id
      t.text :uuid
      t.timestamps null: false
    end


 create_table :locations do |t|
      t.string   :address
      t.integer  :ordinal, :default => 1
      t.integer  :doctor_profile_id
      t.text     :uuid
      t.timestamps
    end

 add_column :locations, :confidence, :integer

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

У вас действительно правильный запрос.Скорее, ваш метод тестирования не работает.

class DoctorLocation < ApplicationRecord
  belongs_to :location
  def self.with_confidence(c)
    DoctorLocation.joins(:location).where(locations: { confidence: c })
  end
end

Эта проходящая спецификация подтверждает, что она работает как положено:

require 'rails_helper'

RSpec.describe DoctorLocation, type: :model do

  after(:each) { DoctorLocation.destroy_all }
  it "includes locations with the correct confidence" do
    dl = DoctorLocation.create!(location: Location.create!(confidence: 2))
    DoctorLocation.create!(location: Location.create!(confidence: 1))
    expect(DoctorLocation.with_confidence(2)).to include dl
    expect(DoctorLocation.with_confidence(2).count).to eq 1
  end
  it "does not include rows without a match in the join table" do
    dl = DoctorLocation.create!(location: Location.create!(confidence: 1))
    expect(DoctorLocation.with_confidence(2)).to_not include dl
  end
end
0 голосов
/ 12 октября 2018

В joins и where (хэшированные аргументы) вам необходимо объявить имя ассоциации (location), а не имя таблицы (locations):

DoctorLocation.joins(:location).where(location: { confidence: 2 })

Это часто источникпутаницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...