ruby-on-rails - "first"在 Ruby 和 Rails 中有什么作用?

标签 ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 rubygems

我实现了一项功能,允许用户设置默认个人资料照片和相册封面照片。

我的数据库中有以下表格:

  • 用户 - 有一个个人资料,有很多相册
  • 个人资料 - 属于用户
  • PhotoAlbum(s) - 属于用户,有很多照片
  • 照片 - 属于相册

设置默认头像的操作是:

def set_default_profile_photo
  photo = Profile.find_by_user_id(current_user.id)
  photo.photo_id = params[:photo_id]
  photo.save
  redirect_to :back
  flash[:success] = "Default photo set!"
end

这很好。

设置我的默认相册照片有点棘手:

def set_default_album_photo
  photo = PhotoAlbum.where(:id => Photo.where(:id => params[:photo_id]).first.photo_album_id)
  photo.first.photo_id = params[:photo_id]
  photo.first.save
  redirect_to :back
  flash[:success] = "Default album photo set!"
end

这是无效的操作:

def set_default_album_photo
  photo = PhotoAlbum.where(:id => Photo.where(:id => params[:photo_id]).first.photo_album_id)
  photo.photo_id = params[:photo_id]
  photo.save
  redirect_to :back
  flash[:success] = "Default album photo set!"
end

我让它工作了,未定义的 photo_id 方法 错误消失了,但那是在更改这些行之后:

photo.photo_id = params[:photo_id]
photo.save

到:

photo.first.photo_id = params[:photo_id]
photo.first.save

我不确定发生了什么,也不知道为什么这种改变使事情有效,并且想了解发生了什么。

最佳答案

我没有评论能力,所以我无法对上面的帖子发表评论,但我应该指出:

Foo.where(:id => X).firstFoo.find(X) 不同。如果没有 id = X 的记录,Foo.find(X) 将引发异常,而另一个将返回 nil。

关于ruby-on-rails - "first"在 Ruby 和 Rails 中有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8953144/

相关文章:

ruby-on-rails - Rails 按日期排序查询

ruby-on-rails - learn-rails bundle 安装解析 Gemfile 时出错

ruby-on-rails - 在处理电子邮件回复时,我怎样才能忽略任何电子邮件客户端细节和历史记录?

ruby-on-rails - Rails 3 如何在 after_create 中获取当前记录 ID

ruby-on-rails - Nginx:无法将 HTTP 响应转发回 HTTP 客户端

ruby - 在数据库中查找每条记录,识别并删除字符串的一部分,然后将记录重新保存到数据库

ruby-on-rails - 如何使用 rspec/rails 测试 AJAX 请求的路由

ruby-on-rails - 在rails中指定gem包的非发布版本

ruby-on-rails - 在现有的 Rails 应用程序上从 Sqlite3 切换到 PostgreSQL

ruby-on-rails - Rails 中的多字段搜索