私の Rails アプリは、アイテムを相互に処理するユーザーのシステムです。ユーザーがアイテムに入札し、所有者が入札を承認してトランザクションが作成されます。その後、ユーザーはトランザクションにコメント (メッセージ) を書き込んで、アプリの外で物事を整理できます。これまでの構造は次のようになります。
User
has_many :items
has_many :bids
Item
belongs_to :user
has_many :bids
Bid
belongs_to :item
belongs_to :user
has_one :transaction
Transaction
belongs_to :bid
has_many :messages
Message
belongs_to :transaction
belongs_to :from, :class_name => "User"
belongs_to :to, :class_name => "User"
これは冗長性を減らすという点ではうまく機能すると思いますが、データを効率的に取り出すにはいくつか問題があります。たとえば、user
の「指定されたアイテム」 (つまり、入札の 1 つでトランザクションが存在するユーザーのアイテム) を取得するには、次のようにします。
user.items.joins(:bids).where("bids.id" => Transaction.select("bid_id"))
または受け取ったアイテム:
Item.joins(:bids).where("bids.user_id" => user.id).where("bids.id" => Transaction.select("bid_id"))
これは、私が必要とする情報に対してかなりコストがかかるようです。
さらに重要なことは、ユーザーのトランザクションを集計し、与えられたアイテムと受け取ったアイテムの比率を表示することです。これは、特定のページのユーザー名の横に表示される可能性があります。現時点で私がやっていることは、上記のすべてのユーザーの与えられたアイテムと受け取ったアイテムを取得してカウントし、次に分割することです (これは非常にコストがかかります...)。トランザクションが作成または破棄されるたびに更新される received_count と given_count を持つ User テーブルに列を作成することを考えていましたが、これは信頼できないようです。
私の質問は、正規化を維持しながら、ユーザーのトランザクションなどの情報をより簡単に取得できるように、データを構造化するより良い方法はありますか?
ありがとう!