ActiveRecord는 선택한 열을 찾아서 만 반환합니다.


89

편집 2

이 문제를 발견하면 이제 pluck을 사용하므로 두 답변을 모두 확인하십시오.


json으로 반향하기 위해 반환하고 싶은 상당히 큰 사용자 지정 데이터 세트가 있습니다. 한 부분은 다음과 같습니다.

l=Location.find(row.id)
tmp[row.id]=l

하지만 다음과 같이하고 싶습니다.

l=Location.find(row.id).select("name, website, city")
tmp[row.id]=l

그러나 이것은 작동하지 않는 것 같습니다. 이 작업을 어떻게해야합니까?

고마워

편집 1
또는 내가 포함하려는 속성의 배열 만 전달할 수있는 방법이 있습니까?

답변:


86

Rails 2에서

l = Location.find(:id => id, :select => "name, website, city", :limit => 1)

...또는...

l = Location.find_by_sql(:conditions => ["SELECT name, website, city FROM locations WHERE id = ? LIMIT 1", id])

이 참조 문서.find숫자, ID 또는 기타 임의의 열 / 제약 조건으로 제한하는 방법을 포함하여 와 함께 사용할 수있는 전체 옵션 목록을 제공합니다 .

ActiveRecord 쿼리 인터페이스가있는 Rails 3에서

l = Location.where(["id = ?", id]).select("name, website, city").first

참조 : 액티브 레코드 쿼리 인터페이스

이러한 연결 호출의 순서를 바꿀 수도 있습니다. .select(...).where(...).first이러한 호출이 수행하는 모든 작업은 SQL 쿼리를 생성 한 다음 전송하는 것입니다.


하지만 난 단 하나의 모든 인스턴스를 원하는
timpone

내 대답을 편집했습니다. :limit이 작업을 수행해야하거나 :first또는 :last또는 당신이 원하는에 따라 무엇이든. 내가 링크 한 참조 문서는 모든 방법을 알려줄 것입니다.
jefflunt

레일 3에 상응하는 쿼리를 수행하는 방법을 포함하도록 업데이트
jefflunt

205

pluck (열 _ 이름)

이 메서드는 직접 SQL 쿼리로 단일 열에 의해 선택을 수행하도록 설계되었습니다. 지정된 열 이름의 값이있는 배열을 반환합니다. 값은 열과 동일한 데이터 유형을 갖습니다.

예 :

Person.pluck(:id) # SELECT people.id FROM people
Person.uniq.pluck(:role) # SELECT DISTINCT role FROM people
Person.where(:confirmed => true).limit(5).pluck(:id)

참조 http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-pluck를

도입 된 레일 3.2부터는 단일 컬럼 만 수용합니다. 레일 4에서는 여러 열을 허용합니다.


1
좋아, 여러 열로 뽑는 것은 굉장합니다 .. 방금이 답변에서 배웠습니다. Rails 3에는 허용되는 답변이 필요합니다.
Jay Shepherd

받아 들여지는 대답은 옳은 이유는 뽑을 수 없었습니다.
prasad.surase

User.pluck (: 이메일 : ID) "사용자"FROM "사용자", "이메일", "사용자", "ID"를 선택합니다..
PRANAV prashant

2
Model.uniq는 이제 Model.distinct입니다 (최소한 Rails 5에서는).
mrturtle

레일 3.2에서 다음을 수행 할 수있는 것 같습니다 Location.select([:name, :website, :city]). 어레이를 통과하면
CTS_AE

24

나는 꽤 새로운 개발자이기 때문에 내 대답은 꽤 늦었습니다. 다음과 같이 할 수 있습니다.

Location.select(:name, :website, :city).find(row.id)

Btw, 이것은 Rails 4입니다.


이것은 선택된 대답이어야하며 질문에 가장 직접적으로 대답해야합니다.
Michael Wiltbank
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.