ROR:按用户名搜索并显示他们的帖子

时间:2017-02-06 13:49:58

标签: ruby-on-rails search

我正在学习Ruby on Rails并设置了搜索表单并且正在运行。在引脚索引视图中,我可以按标题搜索引脚(帖子)。但是,如果我想通过不在引脚表中的用户名进行搜索并在引脚索引页面上显示结果,我该怎么做?如何从其他表中访问属性? (抱歉新手试图解释我的问题)

引脚控制器

 def index
    @pins = Pin.search(params[:term])
end

Pin Model

def self.search(term)
  if term
    where('description LIKE ?', "%#{term}%")
  else
     order('id DESC') 
  end
end

_search.html.erb

<%= form_tag(pins_path, method: :get) do %>
  <%= text_field_tag :term, params[:term] %>
  <%= submit_tag 'Search', description: nil %>
<% end %>

2 个答案:

答案 0 :(得分:1)

假设您已经设置了类似

的内容
class User < ApplicationRecord
  has_many :pins

  # the username is stored in the attribute 'username'
end

class Pin < ApplicationRecord
  belongs_to :user
end

您可以执行以下操作

# PinsController
def index
  terms = params[:term]
  username = params[:username]

  @pins = Pin
  @pins = @pins.where("description LIKE '%?%'", term) if term
  @pins = @pins.includes(:user).where("users.username LIKE '%?%'", username) if username

  # you may want to sort by id anyway
  @pins = @pins.order('id DESC')  
end

请注意,为了简洁起见,我将代码直接放到控制器上。您可以重构此操作以在引脚模型中使用您的搜索方法。

# _search.html.erb
<%= form_tag(pins_path, method: :get) do %>
  <%= text_field_tag :term, params[:term] %>
  <%= text_field_tag :username, params[:username] %>
  <%= submit_tag 'Search', description: nil %>
<% end %>

如果您想进行更多搜索和过滤,可以查看ransack gem,但我认为您正在尝试自己解决这个问题。

虽然这些railscast剧集来自过去,但我认为它们适用于当前的rails版本。无论如何,人们可以从他们那里获得观点

另一个好资源是gorails.com(不以任何方式加入联盟!)。我强烈推荐他们作为学习资源

答案 1 :(得分:0)

如果UserPin

之间存在关联
class User
  has_many :pins
end

class Pin
  belongs_to :user
end

您可以从:user加入Pin并为关联设置条件:

Pin.joins(:user).where('users.username ? AND awesome = ?', 'Max', true)
# or the preferred method
Pin.joins(:user).where(user: { username: 'Max', awesome: true })

请注意,在编写SQL字符串时,我们使用users.username而不是user.username,而是指定表名 - 而不是关联。

要根据您可以执行的用户名搜索引脚:

def self.by_username(term)
  joins(:user).where('users.username LIKE ?', "%#{term}%")
end