1

Transactionモデルがあります。トランザクションにはseller_id列とがありbuyer_idます。どちらもUserIDで埋められます。

それで:

class Transaction
  belongs_to :seller, :class_name => 'User'
  belongs_to :buyer, :class_name => 'User'
end

_

class User
  has_many :selling_transactions, :class_name => 'Transaction', :foreign_key => 'seller_id'
  has_many :buying_transactions, :class_name => 'Transaction', :foreign_key => 'buyer_id'
end

私がやりたいのは、売り手か買い手かに関係なく、不完全なトランザクションを関連付けるhas_manyためにを追加することです。UserUser

class User
  has_many :incomplete_transactions, :class_name => 'Transaction', :conditions => ???
end

_

私はそれを純粋なSQLで書き、私が望む結果を得ました。私のSQLの結合は次のとおりです。

left outer join transactions t on ((t.seller_id = users.id and t.buyer_id is NULL) or (t.buyer_id = users.id and t.seller_id is NULL))

joinそれをhas_manyアソシエーションに変換するにはどうすればよいですか?

編集:
incomplete_transactionsを(配列ではなく)ActiveRecord :: Relationshipとして保持したいと思っていたので、user.incomplete_transactions.limit(15)のようなことができます。

ありがとう。

4

4 に答える 4

1

pdevisserの答えと同様:この質問で与えられた答えと同様のものを使用できます:https ://stackoverflow.com/a/307724/624590

これは基本的に次の結果になります:

class User
  has_many :selling_transactions, :class_name => 'Transaction', :foreign_key => 'seller_id'
  has_many :buying_transactions, :class_name => 'Transaction', :foreign_key => 'buyer_id'

  has_many :incomplete_sales, :class_name => 'Transaction', :foreign_key => 'seller_id', :conditions => { :buyer_id => nil }
  has_many :incomplete_purchases, :class_name => 'Transaction', :foreign_key => 'buyer_id', :conditions => { :seller_id => nil }

  def incomplete_transactions
    incomplete_sales + incomplete_purchases
  end
end

編集:申し分なく、(has_manyを使用して)希望どおりに設定する方法が完全にはわかりませんが、これらの線に沿った何かがあなたのために働くかもしれません:

class User
  has_many :selling_transactions, :class_name => 'Transaction', :foreign_key => 'seller_id'
  has_many :buying_transactions, :class_name => 'Transaction', :foreign_key => 'buyer_id'

  def incomplete_transactions
    Transaction.where("(buyer_id = ? and seller_id = NULL) or (seller_id = ? and buyer_id = NULL)", id, id)
  end
end

whereステートメントはを返すActiveRecord::Associationので、それを呼び出すときにlimit(または他のactiverecord関数)を続けることができます。

于 2012-08-08T20:52:47.170 に答える
0

Rails 3.2を使用していると仮定すると、名前付きスコープを作成することをお勧めします

class Transaction
  belongs_to :seller, :class_name => 'User'
  belongs_to :buyer, :class_name => 'User'

  scope :incomplete_sales, :conditions => { :buyer_id => nil }
  scope :incomplete_purchases, :conditions => { :seller_id => nil }
end

次に、不完全なものにアクセスできます。

user.selling_transactions.incomplete_sales
user.buying_transactions.incomplete_purchases

編集-上記の関連付けも修正しました

制限したい場合は、いつでも配列を使って次のことを行うことができます

user.selling_transactions.incomplete_sales[0,15]
于 2012-08-08T20:39:08.710 に答える
0

修正しました!

これは@DRobinsonのソリューションと非常に似ていますが、ローカルメソッドを定義する代わりにprocとhas_many定義を使用します。

3.1リリースノートによると、条件付きでprocを使用できるようになりました。

proc内では、selfはアソシエーションの所有者であるオブジェクトです。ただし、アソシエーションを積極的にロードする場合を除きます。この場合、selfはアソシエーションが含まれるクラスです。

class User < ActiveRecord::Base
  has_many :incomplete_transactions , :class_name => 'Transaction', 
    :conditions => proc { incomplete_sales + incomplete_purchases }

  has_many :incomplete_sales, :class_name => 'Transaction', :foreign_key => 'seller_id', :conditions => { :buyer_id => nil }
  has_many :incomplete_purchases, :class_name => 'Transaction', :foreign_key => 'buyer_id', :conditions => { :seller_id => nil }

  has_many :selling_transactions, :class_name => 'Transaction', :foreign_key => 'seller_id'
  has_many :buying_transactions, :class_name => 'Transaction', :foreign_key => 'buyer_id'
end

class Transaction < ActiveRecord::Base
  belongs_to :seller, :class_name => 'User'
  belongs_to :buyer, :class_name => 'User'

# scope :incomplete_sales , :conditions => {:buyer_id => nil}
# scope :incomplete_purchases , :conditions => {:seller_id => nil}
end

見る:

于 2012-08-09T16:44:23.160 に答える
0

以下のようなオプションを使用できます

:conditions = ["(t.seller_id = #{self.id} and t.buyer_id is NULL) or (t.buyer_id = #{self.id} and t.seller_id is NULL)"]
于 2012-08-09T17:00:16.220 に答える