Rails 4:与自身建模

时间:2014-03-26 21:30:47

标签: ruby-on-rails ruby-on-rails-4 model

我是铁杆新手,原谅。 我有一个现有的数据库架构

create_table "registrations", force: true do |t|
   t.string   "name",                                   null: false
   t.string   "product1",                               null: false
   t.string   "product_serial1",                        null: false
   t.string   "product2",                               null: false
   t.string   "product_serial2",                        null: false
   t.string   "product3",                               null: false
   t.string   "product_serial3",                        null: false
   t.string   "product4",                               null: false
   t.string   "product_serial4",                        null: false
end

在UI上,我希望能够搜索序列号,并且需要搜索product1,product2,product3 ......

我的想法是让模型与自身联合,以便所有产品都在自己的行中返回,如

select name, product1 product, serial1 serial from registrations where product1 != ''
union all
select name, product2 product, serial2 serial from registrations where product2 != ''
union all
select name, product3 product, serial3 serial from registrations where product3 != ''
union all
select name, product4 product, serial4 serial from registrations where product4 != ''

Rails可以在模型中做这样的事吗?从控制器开始,如果我注册了searchs.search(),它将默认返回上面的SQL。

2 个答案:

答案 0 :(得分:0)

我认为您正在寻找的是以下内容

Registration.where("product_serial1 = ? OR product_serial2 = ? OR product_serial3 = ? OR product_serial4 = ?", search_string, search_string, search_string, search_string)

作为旁注,您可能真的想再看一下您的架构。这些产品序列号看起来像属于产品表,您的注册表应通过中间表连接到许多产品。这article可能有所帮助。

答案 1 :(得分:0)

这可能有所帮助:

Registration.where("product_serial1 like :search or product_serial2 like :search or product_serial3 like :search or product_serial4 like :search", search: "#{params[:search]}")

这将搜索所有序列字段,并仅返回匹配记录。请注意,此示例使用params[:search],但这只能替换为变量。