[英]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. 我认为您需要将
joinining
和where
子句分开。
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.