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]
marr
July 9, 2013, 12:07pm
4
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
konole
July 9, 2013, 12:25pm
7
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 >
tiwi
July 10, 2013, 9:39am
11
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.