3

ユーザー用に次のモデルがあります。

class User < ActiveRecord::Base
  has_many :facebook_friendships
  has_many :facebook_friends, :through => :facebook_friendships, :source => :friend

  def mutual_facebook_friends_with(user)
    User.find_by_sql ["SELECT users.* FROM facebook_friendships AS a
                        INNER JOIN facebook_friendships AS b
                          ON a.user_id = ? AND b.user_id = ? AND a.friend_id = b.friend_id
                        INNER JOIN users ON users.id = a.friend_id", self.id, user.id]
  end

end

class FacebookFriendship < ActiveRecord::Base
  belongs_to :user
  belongs_to :friend, :class_name => 'User'
end

ID 53 のユーザーと ID 97 のユーザーが互いに友達である場合、データベースの facebook_friendships テーブルに行 [53, 97] と [97, 53] があります。これは、相互の友人を計算するために私が思いついた生のSQLクエリです。

SELECT users.* FROM facebook_friendships AS a
  INNER JOIN facebook_friendships AS b
    ON a.user_id = :user_a AND b.user_id = :user_b AND a.friend_id = b.friend_id
  INNER JOIN users ON users.id = a.friend_id

配列の代わりに関係を返すために、私は Mutual_friends_with を使います。このようにして、結果を where(college: 'NYU') などの他の条件と連鎖させて、ActiveRecord の利点をすべて得ることができました。これを行う良い方法はありますか?

4

2 に答える 2

0

これは私が共通の友達を得るために使用するものです。

has_many :company_friendships, autosave: true
has_many :company_friends, through: :company_friendships, autosave: true
has_many :inverse_company_friendships, class_name: "CompanyFriendship", foreign_key: "company_friend_id", autosave: true
has_many :inverse_company_friends, through: :inverse_company_friendships, source: :company, autosave: true  

def mutual_company_friends
  Company.where(id: (company_friends | inverse_company_friends).map(&:id))
end
于 2016-03-15T00:44:06.067 に答える
0

試しました#find_by_sqlか?

http://guides.rubyonrails.org/active_record_querying.html#finding-by-sql

独自の SQL を使用してテーブル内のレコードを検索する場合は、find_by_sql を使用できます。基になるクエリが 1 つのレコードのみを返す場合でも、find_by_sql メソッドはオブジェクトの配列を返します。たとえば、次のクエリを実行できます。

 Client.find_by_sql("SELECT * FROM clients 
                     INNER JOIN orders ON clients.id = orders.client_id   
                     ORDER clients.created_at desc")

find_by_sql は、データベースへのカスタム呼び出しを行い、インスタンス化されたオブジェクトを取得する簡単な方法を提供します。

于 2012-11-18T23:24:45.690 に答える