ActiveRecord знаходить і повертає лише вибрані стовпці


89

редагувати 2

Якщо ви натрапите на це, перевірте обидві відповіді, оскільки я б зараз використовував для цього плак


У мене є досить великий власний набір даних, який я хотів би повернути, щоб вилучити його як 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

У рейках 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, включаючи способи обмеження за номером, ідентифікатором або будь-яким іншим довільним стовпцем / обмеженням.

У Rails 3 з інтерфейсом запитів ActiveRecord

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

Посилання: Інтерфейс запиту активного запису

Ви також можете поміняти місцями ці ланцюгові виклики, виконуючи .select(...).where(...).first- всі ці виклики створюють запит SQL, а потім відправляють його.


але я хочу лише один екземпляр, не всі
timpone

Я відредагував свою відповідь. :limitповинні робити це, або, :firstабо що :lastзавгодно, залежно від того, що ви хочете. Довідковий документ, на який я посилався, розповість вам, як це все зробити.
jefflunt

Оновлено, щоб включити, як зробити еквівалентний запит у Rails 3.
jefflunt

205

зривати (ім'я_столбця)

Цей метод призначений для виконання вибору за допомогою одного стовпця як прямого запиту 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, хоча потребує прийнятої відповіді.
Джей Шеперд

Прийнята відповідь правильна, тому що вищипування тоді не було.
prasad.surase

User.pluck (: email,: id) ВИБЕРІТЬ "users". "Email", "users". "Id" FROM "users"
pranav prashant

2
Model.uniq тепер є Model.distinct (принаймні в Rails 5).
мертуртл

Здається, ви можете зробити наступне в рейках 3.2: Location.select([:name, :website, :city])якщо ви передасте йому масив
CTS_AE

24

Моя відповідь приходить досить пізно, тому що я досить новий розробник. Це те, що ви можете зробити:

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

До речі, це Rails 4


Це має бути обрана відповідь і найбільш безпосередньо відповідає на питання.
Майкл Уілтбанк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.