0

我正在尝试返回一个包含用户数组值的变量。有几个条件必须满足。用户必须public_find设置为true,它不能是current_user(当前登录用户的会话变量),并且它不能已经是友谊的一部分。第一个和第二个条件完美地工作。但是,我遇到了第三部分的问题,其中current_users.friendships需要是ID已经存在关联的用户值的数组。有什么想法吗?

@users = User.find(:all, :conditions => ['
    public_find=true AND 
    id <> ? AND 
    id NOT IN (?)',
    current_user.id, current_user.friendships])

编辑:

我发现我错过了列表中的 pluck。现在效果很好。但是,如果某人还没有朋友,那么current_user.friendships.pluck(:friend_id)将返回NULL。我知道这是不好的做法,并且在使用NOT INand时会返回意想不到的结果NULL。但是,如果返回的数组为空,您如何创建一个条件,您可以将值设置为 [0] 或 [1] 之类的实际值?

@users = User.find(:all, :conditions => ['
    public_find=true AND 
    id <> ? AND 
    id NOT IN (?)',
    current_user.id, current_user.friendships.pluck(:friend_id) || [0]])

再次编辑:

我让它工作了。但是,现在我想知道这样的声明是否是最佳实践。它基本上是在检查是否current_user.friendships.pluck(:friend_id)为空。如果是则返回[0]。否则返回用户 ID 数组(外键为friend_id)。

@users = User.find(:all, :conditions => ['
    public_find=true AND 
    id <> ? AND 
    id NOT IN (?)',
    current_user.id, 
    (current_user.friendships.pluck(:friend_id).empty? ? [0] : current_user.friendships.pluck(:friend_id))])
4

2 回答 2

1

你可以把这个写得更好一点..

显示 public_find 为 true 的所有用户,同时排除当前登录的用户或他们的任何朋友

ids = current_user.friendships.map(&:friend_id).concat([current_user.id])
@users = User.where(:public_find => true).where('id not in ?', ids) 
于 2012-12-12T05:27:40.327 回答
1

我会为此使用一个 arel 表(这保证代码可以在任何数据库上运行):

t, f = User.arel_table, current_user.friendships
query = t[:public_find].eq(true).and(t[:id].not_eq(current_user.id))
query = query.and(t[:id].not_in(f.pluck(:friend_id))) unless f.empty?
@users = User.where(query)

为以下用户生成 SQLcurrent_user = 3并与用户建立单一友谊id = 1

SELECT "users".* FROM "users"
WHERE ("users"."public_find" = 't' AND "users"."id" != 3 AND "users"."id" NOT IN (1))

如果current_user.friendshipsnil,该unless f.empty?子句将完全阻止该条件的应用,因此它不会出现在 SQL 中:

SELECT "users".* FROM "users"
WHERE ("users"."public_find" = 't' AND "users"."id" != 3)

另外,请注意,由于此代码使用where而不是find,因此最终结果是ActiveRecord::Relation结果数组,而不是结果数组。这意味着您可以进一步将条件链接到它,例如,将结果按 排序updated_at,将最后一行更改为:

@users = User.where(query).order(:created_at)
于 2012-12-12T05:40:24.150 回答