0

我有这样的事情:

@photos = Photo.where(:user_id => @user.id)

我想要类似的东西:

@photos = Photo.where(:user_id => @user.id, :public => 1)

但是,这不起作用。我找不到如何使用“AND”运算符

4

3 回答 3

5

您的解决方案应该有效:

Photo.where(user_id: @user.id, public: 1)

生成这样的查询(假设 MySQL 和 a@user.id为 5):

SELECT `photos`.* FROM `photos` WHERE ((`photos`.`user_id` = 5 AND `photos`.`public` = 1))

我怀疑这public是一个布尔字段,取决于您的数据库适配器,true并且false可以存储为1and0或 as tand f

尝试传递一个布尔值并让 Rails 处理转换:

Photo.where(user_id: @user.id, public: true)

如果您设置关联和一些范围,那就更容易了:

class User < ActiveRecord::Base
  has_many :photos
end

class Photo < ActiveRecord::Base
  belongs_to :user
  scope :public, -> { where(public: true) }
  scope :private, -> { where(public: false) }
end

现在您可以通过以下方式获取用户的照片:

@user.photos.public   # user's public photos
@user.photos.private  # user's private photos
于 2013-09-12T11:19:01.253 回答
2

数据库并不总是将布尔值存储为1or 0
因此 ActiveRecord 对其进行规范化,并且仅在使用哈希条件时识别truefalse(或)。nil

所有这些查询都是等价的:

@photos = Photo.where("user_id = ? AND public = ?", @user.id, 1)
@photos = Photo.where(user_id: @user.id, public: true)
@photos = Photo.where(user: @user, public: true)

但通常更喜欢这样写:

@photos = @user.photos.where(public: true)
于 2013-09-12T11:26:31.740 回答
-1

尝试

@photos = Photo.where("user_id = ? AND public = ?", @user_id, 1) 

活动记录文档将为您提供帮助。

于 2013-09-12T11:02:33.730 回答