我有这样的事情:
@photos = Photo.where(:user_id => @user.id)
我想要类似的东西:
@photos = Photo.where(:user_id => @user.id, :public => 1)
但是,这不起作用。我找不到如何使用“AND”运算符
我有这样的事情:
@photos = Photo.where(:user_id => @user.id)
我想要类似的东西:
@photos = Photo.where(:user_id => @user.id, :public => 1)
但是,这不起作用。我找不到如何使用“AND”运算符
您的解决方案应该有效:
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
可以存储为1
and0
或 as t
and 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
数据库并不总是将布尔值存储为1
or 0
。
因此 ActiveRecord 对其进行规范化,并且仅在使用哈希条件时识别true
和false
(或)。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)