简体   繁体   English

导轨连接两个表

[英]rails join two tables

Models: 楷模:

Fruit:  fields - "fruit_type"  

has_many: apples
has_many :bananas  



Apple fields: f1, f2, fruit_id, some other fields  
belongs_to: fruit

Banana: f1, f2, fruit_id, some other fields related to banana  
belongs_to :fruit

How to get all fruits by searching fruit_type, f1, f2 fields. 如何通过搜索fruit_type,f1,f2字段获得所有水果。 We have 3 inputs: fruit_type, f1, f2 so if we type in only one field(say f1), only f1 field wil be searched. 我们有3个输入:fruit_type,f1,f2,因此,如果仅输入一个字段(例如f1),则仅搜索f1字段。 If fruit_type, f1, f2 inputs are entered, both fields f1, f2 will be searched and finally fruits will be returned. 如果输入了fruit_type,f1,f2输入,将同时搜索字段f1,f2,最后将返回水果。

Lets say either f1 or only f2 input is entered, then below works: 假设输入了f1或仅输入了f2,则可以进行以下工作:

scope = Fruit.joins("left join apples on apples.fruit_id=fruits.id left join bananas on bananas.id=fruits.id where (apples.f1 like '#{f1_input_val}%' or bananas.f1 like '#{f1_input_val}%')")  

If fruit_type, f1, f2 input also entered, whats the query ? 如果还输入了fruit_type,f1,f2输入,则查询是什么? Below not working: 下面不起作用:

scope = Fruit.all #if no queries

scope = scope.where("fruit_type like ?", "#{fruit_type_input}%")  if fruit_type_input.present?  

scope = scope.joins("left join apples on apples.fruit_id=fruits.id left join bananas on bananas.id=fruits.id where (apples.f1 like '#{f1_input_val}%' or bananas.f1 like '#{f1_input_val}%')") if f1_input_val.present?  

scope = scope.joins("left join apples on apples.fruit_id=fruits.id left join bananas on bananas.id=fruits.id where (apples.f2 like '#{f2_input_val}%' or bananas.f2 like '#{f2_input_val}%')") if f2_input_val.present?

I think you need to separate joinining and where clauses. 我认为您需要将joininingwhere子句分开。

scope = Fruit.all #if no queries

scope = scope.where("fruit_type like ?", "#{fruit_type_input}%")  if fruit_type_input.present?  

if f1_input_val.present? or f2_input_val.present?
  scope = scope.joins("left join apples on apples.fruit_id=fruits.id left join bananas on bananas.id=fruits.id")

  scope = scope.where("apples.f1 like '#{f1_input_val}%' or bananas.f1 like '#{f1_input_val}%')") if f1_input_val.present?  
  scope = scope.where("apples.f2 like '#{f2_input_val}%' or bananas.f2 like '#{f2_input_val}%')") if f2_input_val.present?
end
scope # just return a resulted scope

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM