我在Rails中开发一个基本的照片库网站,允许用户上传图片。我使用Devise进行用户身份验证。我的图像模型有一个uid字段,用于在上传图像时保存当前用户的ID。
这是控制器中的create方法:
def create
@image = Image.new(image_params)
@image.uid = current_user.id
if @image.save
redirect_to @image
end
end
然后在视图中我想要检索数据库中uid与当前用户的ID匹配的所有图像(即,显示所有当前用户的图像)。现在我有:
<% Image.where("uid == current_user.id") do |image|%>
<div class="col-lg-3 col-md-4 col-xs-6 thumb">
<a class="thumbnail" href="#">
<!--<img class="img-responsive" src="<%image.image_url%>" alt="">-->
<%= image_tag image.image_url(:thumb) %>
</a>
</div>
<% end %>
但是,没有显示图像,我猜是因为像这样的current_user.id只是返回nil。
是否可以使用current_user.id值查询ActiveRecord数据库?
答案 0 :(得分:4)
您的语法仅适用于您尝试执行的操作:
<% images = Image.where("uid =?", current_user.id) %>
然后,您可以使用.each
答案 1 :(得分:1)
虽然您可以简单地使用参数化查询,例如@ toddmetheny的优秀答案,但是有一个更好的传统 Rails方式来处理链接记录。
重命名images.uid
列user_id
。这使您可以在很少的配置下使用ActiveRecord关系。
uid
对于外键列来说也是一个糟糕的名称选择,因为它是unique identifier的通用缩写,因此它违反了原则中最不可思议的 - 这是一种就像一个很好的方式来说,不要为任何可怜的灵魂使用你的代码设置一堆陷阱。
class RenameImagesUidToUserId < ActiveRecord::Migration
def change
rename_column :images, :uid, :user_id
end
end
然后在两个模型之间建立关系:
class User < ActiveRecord::Base
has_many :images
end
class Image ActiveRecord::Base
belongs_to :user
end
这可以让您User.find(1).images
或Images.find(1).user
。
您可以像这样创建关联记录:
def create
@image = current_user.images.new(image_params)
if @image.save
redirect_to @image
end
end
然后列出你可以做的图像:
<% current_user.images.each do |image| %>
<div class="col-lg-3 col-md-4 col-xs-6 thumb">
<a class="thumbnail" href="#">
<%= image_tag image.image_url(:thumb) %>
</a>
</div>
<% end %>