如何查询Ruby on Rails对象的嵌套属性?

时间:2014-09-16 16:55:05

标签: sql ruby-on-rails ruby activerecord

我有用户模型和产品型号。用户有一个产品,产品有一个用户。为了创建用户和产品模型,我有一个单独的表单,使用嵌套属性创建它们。

我正在尝试根据用户的姓名,电子邮件地址或产品序列号创建可以查找用户的搜索。我在查找用户的姓名或电子邮件地址时有此工作,但我不知道如何以相同的形式按序列号查找用户的产品。

所以我试图搜索User.last_name,User.email和User.product.serial - 无法弄清楚如何解决这个问题。

这是我的用户模型

class User < ActiveRecord::Base

  has_many :products, dependent: :destroy

  accepts_nested_attributes_for :products, :allow_destroy => true

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(?:\.[a-z\d\-]+)*\.[a-z]+\z/i

  validates :last_name, presence: true
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }

  def self.search(query)
    where("last_name = ? OR email = ?", query, query)
  end
end

我的产品型号

class Product < ActiveRecord::Base
  belongs_to :user

  default_scope -> { order('created_at DESC') }

  validates :serial, presence: true
end

包含搜索字段的我的用户视图

<%= form_tag(users_path, method: "get", :id => "user_search_form") do %>
  <%= text_field_tag :search, params[:search], placeholder: "Search users" %>
  <%= submit_tag("Search", :name => nil ) %>
<% end %>

我的用户控制器的相关部分

def index
  if params[:search]
    @users = User.search(params[:search]).order("created_at DESC").paginate(page: params[:page], :per_page => 30)
  else
    @users = User.paginate(page: params[:page], :per_page => 30)
    @product = @users.product 
  end
end

1 个答案:

答案 0 :(得分:0)

你可以这样做:

def self.search(query)
  joins(:products)
    .where("last_name = :query OR email = :query OR products.serial = :query", 
      query: query)
end