2012-01-15 15 views
0

私は2モデル:PurchaseUserがあります。 Userhas_many :purchases,Purchasebelongs_to :userRORの関係

最後の3ヶ月以内に購入したユーザー数と、メールアドレスを印刷する方法(「購入」にはcreated_atフィールドがあります)(これをやりたいだけですコンソールを使用して)。私はルビーの観点からそれについてどうやって行くのか少し混乱しています(私はまっすぐなSQLクエリを行うことができましたが、Rubyでそれを行う方法を理解したいと思います)。

答えて

0
Rails 2: Purchase.all(:conditions => ["created_at > ?", 3.months.ago]).user.uniq 

Rails 3: Purchase.where(:created_at > 3.months.ago).user.uniq 
+0

を試してみましたが、離れて

ことから、ユーザーの電子メールの配列を返します。 .uniq:NoMethodError:#(Rails 2 btw)の未定義メソッド 'user ' – execv

+3

' Purchase.all(:conditions => ["created_at>?"、3.months.ago])を試してください。マップ(&:ユーザー).uniq' –

-1

Purchase.where(:created_at > 3.months.ago).map(&:user).uniq

1
User.joins(:purchases).where("purchases.created_at > ?", 3.month.ago) 
To get distinct user list 
User.joins(:purchases).where("purchases.created_at > ?", 3.month.ago).uniq 
To get distinct collection of user emails 
User.joins(:purchases).where("purchases.created_at > ?", 3.month.ago).uniq.pluck(:email) 
0

それは常にデータ構造に依存し、uが持っているでしょうどのように多くのレコード。 これは、URD環境にあるコンソール上にあれば何でも好きなことです。そうでなければ、良いSQLクエリがうまく実行されます。

  1. 必要なフィールドを選択するには、できるだけIDを取得するには、pluckを使用します。
  2. これらのIDを使用してストレートクエリを実行します。 比較するには<> uはsqlを使用する必要があります。 電子メールだけが必要な場合は、「ユーザーから電子メールを選択する」ようにクエリに選択を追加します。 'select * from users'の代わりに使用します。

ので:

User.joins(:purchases).where('purchases.created_at > ?', .month.ago).pluck('distinct(email)') 

はあなたのuはthis?を読むことを気にして私は.userをしようとするとthat?