Ruby on rails Rails 4:与自身的模型联合

Ruby on rails Rails 4:与自身的模型联合,ruby-on-rails,ruby-on-rails-4,model,Ruby On Rails,Ruby On Rails 4,Model,我是rails新手,请原谅。 我有一个现有的数据库模式 create_table "registrations", force: true do |t| t.string "name", null: false t.string "product1", null: false t.string "product_serial1",

我是rails新手,请原谅。 我有一个现有的数据库模式

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可以在模型中执行类似的操作吗?与控制器类似,如果I registrations.search(),默认情况下将返回上述SQL

我想你要找的是如下内容

Registration.where("product_serial1 = ? OR product_serial2 = ? OR product_serial3 = ? OR product_serial4 = ?", search_string, search_string, search_string, search_string)
作为补充说明,您可能真的想再看看您的模式。这些产品序列号看起来像是属于products表,您的注册表应该通过中间表连接到许多产品。这可能会有所帮助。

这可能会有帮助:

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]
,但是这可以用一个变量来代替。

这就是我目前拥有的,但是我正在寻找更好的解决方案。上面的问题是,如果用户有两个产品和一个序列匹配项,那么在视图中我会同时显示product1和product2,因为这就是结果集。理想情况下,我将只返回一个与一个产品匹配的结果。我在想也许我需要调整分贝。我希望不会,因为这是一个现有的数据库。