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

使用活动记录范围的好时机。http://guides.rubyonrails.org/active_record_querying.html#scopes

这是一个简单的例子

用户.rb

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

在你的控制器中

@followers = User.followers
于 2013-02-15T17:23:26.027 回答
1

Digital Cake 正朝着正确的方向前进,但并不完全正确。范围是用户的方法,而不是用户。你需要的是:

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

这将返回一个 ActiveRecord::Relation,您可以将其他条件、顺序、分页等链接到它,如

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

我似乎在以下方面取得了一些成功:

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

尽管它起作用很奇怪,但我不完全确定它为什么起作用。

于 2013-02-15T17:26:25.420 回答