"has_one : through"연관에서 하나의 필드를 검색하려고합니다. ..레일 4 : ActiveRecord => "선택할 수 없습니다"has_one : db의 필드를 통해
class Location < ActiveRecord::Base
belongs_to :person
belongs_to :forecast
end
class Forecast < ActiveRecord::Base
belongs_to :locaiton
has_one :person, :through => :location
end
class Person < ActiveRecord::Base
end
나는 쿼리를 기반으로 만 사람 이름을 꺼내서 액티브를 사용하여 만들고 싶어 :
class CreatePersons < ActiveRecord::Migration
def change
create_table :person do |t|
t.string :first_name
t.string :last_name
t.date :age
end
end
def change
create_table :location do |t|
t.decimal :longitude
t.decimal :latitude
t.string :city
t.string :state
t.references :person
end
end
def change
create_table :forecasts do |t|
t.timestamp :time
t.text :summary
t.decimal : precipitation
t.references :location
t.timestamps
end
end
end
... 다음과 같은 모델 : 가정 나는 다음과 같은 모델을 가지고 예측 (나는 그것의 어리 석음을 알고있다, 그러나 이것은 다만 운동이다); 이 같은 뭔가 :
# i realize this is a bad query, i'm putting this here to make my question stronger
Forecast.where("percipitation > ?", 1.5).select(:first_name)
또는 SQL 측면에서
select first_name from forecast fc
inner join locaiton loc on loc.id = fc.location_id
inner join person on person.id = loc.person_id
where precipitation > 1.5
그래서 난 시도 뭔가 같은 :
Forecast.joins(:person).where("percipitation > ?", 1.5).select(:person)
# Forecast.joins(:person).where("percipitation > ?", 1.5).select(:person).to_sql
# select 'person' from forecast fc
# inner join locaiton loc on loc.id = fc.location_id
# inner join person on person.id = loc.person_id
# where fc.percipitation > 1.5
이 예측 개체의 날 빈 인스턴스를 반환
그럼 난 이것을 시도 :
Forecast.joins(:person).where("percipitation > ?", 1.5).select("person.first_name")
# Forecast.joins(:person).where("percipitation > ?", 1.5).select("person.first_name").to_sql
# select 'person.first_name' from forecast fc
# inner join locaiton loc on loc.id = fc.location_id
# inner join person on person.id = loc.person_id
# where fc.percipitation > 1.5
그러나, 이것은 또한 빈 예측의 colleciton 결과이 내가, 정확하게 원하는 결과 일을하지만
객체하지만 DB가 조회 한 후이 이미 :
result = Forecast.joins(:person).where("precipitation > ?", 1.5)
result.each do |forecast|
puts forecast.person.first_name # => "John", "Bob", "Jim"
end
을
select를 사용하여 DB에서 first_name 만 가져오고 데이터베이스에서 first_name 만 꺼내지 못하는 이유는 무엇입니까? 나는 분명히 뭔가를 놓친다.
을, 나는 잠재적으로 범위를 추가 할 수 있음을 이해하지만, 내 이해의 범위 내에서 단지 나에게 능력을 제공하는 것입니다 수동 쿼리를 실행하고 : file : /// Users/tomek/Library/Application % 20Support/Dash/DocSets/Ruby_on_Rails_4/Ruby % 20on % 20Rails와 같은 select ("person.first_name")와 같은 구문 설탕을 제공하십시오. docset/Contents/Resources/Documents/api.rubyonrails.org/classes/ActiveRecord/Scoping/명명 된/ClassMethods.html # method-i-scope. 하지만 왜 내가 select를 통해 프로젝트를 진행할 수 없는지를 알아 내려고 노력하고 있지만 각 메소드에서 할 수 있습니다. –