1

ユーザーがメールアドレスで自分の友達を検索できるようにしようとしています。私は次のようなことをしたいと思います:

current_user.search('test@fake.com')

その電子メール アドレスを持つ現在のユーザーの友人の配列を返すようにします。

だから私は私のユーザーモデルに設定された非常に基本的な友情関係を持っています

user.rb
has_many :friendships
has_many :friends, through: :friendships, source: :friend
has_many :inverse_friendships, class_name: 'Friendship', foreign_key: 'friend_id'
has_many :inverse_friends, through: :inverse_friendships, source: :user

friendship.rb
belongs_to :friend, class_name: 'User', foreign_key: 'friend_id'
belongs_to :user

メールアドレスで友達を検索できるメソッドをユーザーモデルに設定したいと考えています。うまくいかない

def search(query)
  conditions = ['friends.user_id = ? AND email LIKE ? ', self.id, "%#{query}%"]
  User.includes(:friends).where(conditions)
end

自己参照モデルの関係を検索しようとしているので、ここでアクティブ レコード クエリ/SQL をフォーマットする方法がわからないだけだと思います。アイデアはありますか?

ありがとう!

4

3 に答える 3

1

Digital Cakeは正しい方向に進んでいますが、正確には正しくありません。スコープはユーザーのメソッドであり、ユーザーではありません。必要なものは次のとおりです。

def followers_by_email(email) 
   friends.where("email like ?", "%#{email}%")
end   

これにより、ActiveRecord :: Relationshipが返されます。この関係に、他の条件、順序付け、ページ付けなどを連鎖させることができます。

user.followers_by_email("me@example.com").order(:first_name).limit(10)
于 2013-02-15T17:52:06.780 に答える
1

アクティブなレコードスコープを使用する良い機会です。http://guides.rubyonrails.org/active_record_querying.html#scopes

ここに簡単な例があります

user.rb

scope :followers, friends.where(:published => true).order("created_at DESC").limit(150)

コントローラーで

@followers = User.followers
于 2013-02-15T17:23:26.027 に答える
0

私はいくつかの成功を収めているようです:

conditions = ['contacts.user_id = ? AND users.email LIKE ? ', self.id, "%#{query}%"]
User.includes(:inverse_friends).where(conditions)

機能するのは奇妙ですが、なぜ機能するのかは完全にはわかりません。

于 2013-02-15T17:26:25.420 に答える