0

関係のある 3 つのテーブルを使用して、別のテーブルから列を検索しようとしています。

私の見解policy_vehiclesでは、text_field_tag「raz_soc」で検索したいと考えています。

私のテーブルは次のとおりです。

Policy_vehicles
   |id|       |policy_id| 
    integer      integer
     100            1 
     200            2

Policies
   |id|    |client_id|
   integer  integer
    1        1
    2        2     

Clients
   |id|     |raz_soc|
    integer  varchar(255)
    1       MARATEX SAC
    2       ATT

これは私のコントローラーです:

class PolicyManagement::PolicyController < ApplicationController

  def generate_print_per_vehicle
      params[:search_policy_id] =   Policy.find(:all,:joins => :client ,:conditions => ['raz_soc LIKE ?',"%#{params[:search_raz_soc]}%"  ])
      @policies= PolicyVehicle.find(:all,:joins => :policy, :conditions => ['policy_id = ?',params[:search_policy_id] ]) 
  end

end

これは私のモデルです:

class Policy < ActiveRecord::Base
  belongs_to :client
  has_many :policy_vehicles
end

class PolicyVehicle < ActiveRecord::Base
  belongs_to :policy
end

class Client < ActiveRecord::Base
  has_many :policies
end

これは、別のテーブルの列で検索しようとしている私のビューです。

<% form_tag :controller=>"policy_management/policy",:action=>"generate_print_per_vehicle" do %>
 Society:
   <%= text_field_tag "search_raz_soc",params[:search_raz_soc] %>
   <%= submit_tag "Buscar", :name => nil %>
<% end %>

私のログは次のとおりです。

  Mysql::Error: Operand should contain 1 column(s): SELECT `policy_vehicles`.* FROM `policy_vehicles`   INNER JOIN `policies` ON `policies`.id = `policy_vehicles`.policy_id  WHERE (policy_id = 166,1540,2822,4074)

次のような検索になるはずです。

 Policy Load (3.1ms)   SELECT `policies`.* FROM `policies` INNER JOIN `clients` ON `clients`.id = `policies`.client_id WHERE (raz_soc = 'MARATEX SAC') 
 PolicyVehicle Load (0.3ms)   SELECT `policy_vehicles`.* FROM `policy_vehicles` INNER JOIN `policies` ON `policies`.id = `policy_vehicles`.policy_id WHERE (policy_id = 1) 

私はこれを試しましたが、動作していません:

 #controller
 @policy =         Policy.find(:all,:joins => :client ,:conditions => ['raz_soc LIKE ?',params[:search_raz_soc]  ])
 @policies= PolicyVehicle.find(:all,:joins => :policy, :conditions => ['policy_id = ?',@policy    ])

#logs
 Policy Load (3.1ms)   SELECT `policies`.* FROM `policies` INNER JOIN `clients` ON `clients`.id = `policies`.client_id WHERE (raz_soc = 'MARATEX SAC') 
 PolicyVehicle Load (0.3ms)   SELECT `policy_vehicles`.* FROM `policy_vehicles` INNER JOIN `policies` ON `policies`.id = `policy_vehicles`.policy_id WHERE (policy_id = 70353610714140) 

私はこのようなことをしようとしています

 select * from policy_vehicles where policy_id
    IN ( SELECT id FROM policies WHERE
    client_id IN (SELECT id FROM clients raz_soc = ?) )

誰かが私を助けてくれますか?

4

1 に答える 1

2

これを試してください(クエリが何を返すかを説明したので、これがあなたが望むものであることを確認してください)

@policies =  Policy.find(:all,:joins => :client ,
             :conditions => ['raz_soc LIKE ?',"%#{params[:search_raz_soc]}%"] ) 
# returns an array of policy records based on the raz_soc condition on client 

@policy_vehicles = PolicyVehicle.find(:all,:joins => :policy,
                   :conditions => ['policy_id IN (?)',@policies] )
# returns an array of policy_vehicles that are associated with any record in the @policies array

他のオプションは、次のように単一のクエリで実行することです。

@policy_vehicles = PolicyVehicle.joins(:policy => :client).
                   where('clients.raz_soc LIKE ?',"%#{params[:search_raz_soc]}%")
于 2013-10-02T19:13:23.943 に答える