Sql

prośba - jak w ruby uzyskać tablice wynikową zawierającą wartosci a nie rekordy?

2.0.0p195 :061 > Order.select(:id) Order Load (0.7ms) SELECT id FROM "orders" => [#<Order id: 37>, #<Order id: 38>, #<Order id: 39>, #<Order id: 40>] 2.0.0p195 :062 > Order.select(:id).class => ActiveRecord::Relation

Order.find(:all).collect(&:id)

dzieki!!!
dasz radę jeszcze podpowiedziec dlaczego w tym zapytaniu nie wyrzuca userów?

[code]2.0.0p195 :072 > Issue.all

Issue Load (0.7ms) SELECT “issues”.* FROM “issues”
=> [#<Issue id: 12, order_id: 37, issue_time: “2013-07-09 10:59:14.966387”, user: “test12”
, created_at: “2013-07-09 11:28:50”, updated_at: “2013-07-09 11:28:50”>]

2.0.0p195 :073 > Issue.select(“DISTINCT issue_time”)

Issue Load (1.1ms) SELECT DISTINCT issue_time FROM “issues”
=> [#<Issue issue_time: “2013-07-09 10:59:14.966387”>]

2.0.0p195 :074 > Issue.select(“DISTINCT user”)

Issue Load (0.3ms) SELECT DISTINCT user FROM “issues”
=> [#][/code]

Można użyć pluck, Order.pluck(:id)

Order.pluck(:id)

W ten sposób unikniesz ładowania obiektów - pobierane są tylko wartości.

jesteście wielcy!!!, kombinowałem z 40 min

2.0.0p195 :101 > Order.pluck(:user).uniq (0.7ms) SELECT "orders"."user" FROM "orders" => ["test12"]
chociaż łazi mi o głowie czemu DISTINCT nie oddawał userów z bazy

dlatego, że user to pewnie u ciebie inna tabela i nie istnieje takie pole, jak user. Zważ, że w Twoim zapytaniu jest SELECT "orders"."user"
więc zakładam, że zadziałałoby (aczkolwiek to tylko domysł, nie używałem distinct w railsach w ten sposób) Issue.select("DISTINCT 'issues'.'user'")

zobacz w kodzie zapytanie Issue.all zwraca pole usera

Co baza odpowiada, jak ją bezpośrednio pytasz: “SELECT DISTINCT user FROM issues” ?

oddaje unikatowe nazy user natomiast ruby:

2.0.0p195 :011 > Issue.first Issue Load (0.9ms) SELECT "issues".* FROM "issues" ORDER BY id DESC LIMIT 1 => #<Issue id: 31, order_id: 55, issue_time: "2013-07-10 09:43:58 +0200", user: "bkiepa", created_at: "2013-07-10 07:48:09", updated_at: "2013-07-10 07:48:09"> 2.0.0p195 :012 > Issue.first.user Issue Load (0.8ms) SELECT "issues".* FROM "issues" ORDER BY id DESC LIMIT 1 => "bkiepa" 2.0.0p195 :013 > Issue.select(:user) Issue Load (0.8ms) SELECT user FROM "issues" ORDER BY id DESC => [#<Issue >, #<Issue >, #<Issue >, #<Issue >, #<Issue >, #<Issue >, #<Issue >] 2.0.0p195 :014 >

A czy te obiekty Issue z Twojego ostatniego zapytania mają pole “user”? Spróbuj wywołać metodę “user” na dowolnym z nich.

BTW. uniq jest lepiej wywoływać przed pluck, bo wtedy jest robiony distinct. W przeciwnym wypadku uniq wywołuje się na Arrayu w Rubym.