Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查找条件不在数组中的所有匹配条件_Sql_Ruby On Rails 3_Associations - Fatal编程技术网

Sql 查找条件不在数组中的所有匹配条件

Sql 查找条件不在数组中的所有匹配条件,sql,ruby-on-rails-3,associations,Sql,Ruby On Rails 3,Associations,我试图返回一个具有用户数组值的变量。必须满足几个条件。用户必须将public\u find设置为true,它不能是当前用户(当前登录用户的会话变量),也不能已经是友谊的一部分。第一个和第二个条件完美地工作。但是,我在第三部分遇到了一个问题,即当前用户。友谊需要是已经存在关联的用户的ID值的数组。有什么想法吗 @users = User.find(:all, :conditions => [' public_find=true AND id <> ? AND

我试图返回一个具有用户数组值的变量。必须满足几个条件。用户必须将
public\u find
设置为
true
,它不能是
当前用户(当前登录用户的会话变量),也不能已经是友谊的一部分。第一个和第二个条件完美地工作。但是,我在第三部分遇到了一个问题,即
当前用户。友谊需要是已经存在关联的用户的
ID
值的数组。有什么想法吗

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

我让它工作了。然而,现在我想知道这样的陈述是否是最佳实践。它基本上是检查
当前用户.friends.pull(:friend\u id)
是否为空。如果是,则返回[0]。否则返回一个用户id数组(外键为
friend\u id

@users=User.find(:all,:conditions=>['
public\u find=正确且
身份证?和
id不在(?),
当前_user.id,
(当前用户.friendships.pulk(:friend\u id).空???[0]:当前用户.friendships.pulk(:friend\u id)))

你可以把这个写得再漂亮一点

显示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) 

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

current_user=3
和与
id=1
的用户的单一友谊生成SQL:

SELECT "users".* FROM "users"
WHERE ("users"."public_find" = 't' AND "users"."id" != 3 AND "users"."id" NOT IN (1))
如果
current\u user.friendships
nil
,则
除非f.empty?
子句将阻止应用该条件,因此它不会出现在SQL中:

SELECT "users".* FROM "users"
WHERE ("users"."public_find" = 't' AND "users"."id" != 3)
另外,请注意,由于此代码使用
where
而不是
find
,因此最终结果是
ActiveRecord::Relation
而不是结果数组。这意味着您可以将条件进一步链接到它上,例如,要通过
更新_对结果进行排序,请将最后一行更改为:

@users = User.where(query).order(:created_at)
SELECT "users".* FROM "users"
WHERE ("users"."public_find" = 't' AND "users"."id" != 3 AND "users"."id" NOT IN (1))
SELECT "users".* FROM "users"
WHERE ("users"."public_find" = 't' AND "users"."id" != 3)
@users = User.where(query).order(:created_at)