Rails 4-合并多个find_by请求

时间:2013-11-17 06:55:59

标签: sql ruby-on-rails ruby

我有一个名为“Post”的模型,它有一个用户定义的guid整数字段以及一个用作博客的名称字段。我需要做的是能够通过添加guid或名称参数找到帖子的帖子,但不能一起添加,如果guid被请求,它会重定向到帖子的名称参数。我有一条名为blog的路线,我将其用作路径,而不是post。 (例如:http://mysite/blog/53重定向到http://mysite/blog/name-given-to-the-post)

我设法让它工作,但我知道这是非常低效的,因为它正在发出两个几乎相同的查找请求,但我知道没有别的方法可以做到。

Post_controller.rb

def show
     @post = Post.find_by guid: params[:guid]
     @slug = Post.find_by_slug(params[:guid])
     if request.path != blog_path(@slug)
       redirect_to blog_path(@post)
     end
  end

我在路线中将blog映射到post,这就是为什么您会看到blog_path的原因:

get 'blog/:guid', to: 'posts#show', as: 'blog'
  resources :posts, path: 'blog', as: 'blog'

Post.rb(型号):

class Post < ActiveRecord::Base

  before_create :create_slug

def to_param 
  slug
end

def create_slug
  self.slug = self.name.parameterize
end
.....
end

我还必须在show.html.erb文件中将@post更改为@slug,因为我不幸使用了逻辑的向后类型。

<%= @slug.name %>
<%= sanitize(@slug.summary) %>

1 个答案:

答案 0 :(得分:1)

我不理解您帖子中的所有问题,尤其是有关@post@slug内容的部分......

为什么不将两个变量分配给同一个对象?它应该是同一个对象,无论它是通过slug或名称从数据库中获取的,还是我错了?

您可以使用OR

等sql中的Post.where('slug = ? OR name = ?', params[:guid], params[:guid])查询来查询对象