Rails использует несколько запросов в одном запросе для импорта данных файла csv

#mysql #sql #ruby-on-rails

#mysql #sql #ruby-on-rails

Вопрос:

Как передать данные araay в запросе оператора.

 data = ["055226", "000879", "069889", "078720", "078764"] //use array data in query statements IN operator

file_data = ActiveRecord::Base.connection.execute("SELECT t1.user_id, t2.dept_id, t1.price, 
t3.first_name, t3.last_name
      FROM price_table t1
      INNER JOIN user_branch_table t2
        on t1.user_id = t2.user_id 
      INNER JOIN user_deatils_table t3
        on t1.user_id = t3.user_id
      where t1.user_id in (#{data}) and now() between t2.start_dt and t2.end_dt").first
  

Я пробовал разные способы, но не получилось правильно.

Ответ №1:

Приведенное ниже должно работать:

     file_data = ActiveRecord::Base.connection.execute("SELECT t1.user_id, t2.dept_id, t1.price, 
t3.first_name, t3.last_name
      FROM price_table t1
      INNER JOIN user_branch_table t2
        on t1.user_id = t2.user_id 
      INNER JOIN user_deatils_table t3
        on t1.user_id = t3.user_id
      where t1.user_id in (#{data.join(',')}) and now() between t2.start_dt and t2.end_dt").first
  

Приведенное выше не будет работать для строковых входных данных, приведенное ниже должно работать для строковых входных данных

     ActiveRecord::Base.connection.execute(
      ActiveRecord::Base.send(:sanitize_sql_array, ["SELECT 
        t1.user_id, t2.dept_id, t1.price, 
        t3.first_name, t3.last_name
        FROM price_table t1
        INNER JOIN user_branch_table t2
        on t1.user_id = t2.user_id 
        INNER JOIN user_deatils_table t3
        on t1.user_id = t3.user_id
        where t1.user_id in (?) and now() between t2.start_dt and t2.end_dt", data])).first
  

Комментарии:

1. спасибо за ответ, второй работает, но мне нужно добавить новую цену данных файла при отображении на экране ‘file_data’. У меня возникает проблема с этим.

2. Теперь я получаю данные из базы данных с помощью file_data = ActiveRecord::Base.connection.execute( ActiveRecord::Base.send(:sanitize_sql_array, ["SELECT t1.user_id, t2.dept_id, t1.price, t3.first_name, t3.last_name FROM price_table t1 INNER JOIN user_branch_table t2 on t1.user_id = t2.user_id INNER JOIN user_deatils_table t3 on t1.user_id = t3.user_id where t1.user_id in (?) and now() between t2.start_dt and t2.end_dt", data])) но у меня есть другие данные для добавления в файловые данные в конце данных каждой записи. file_new_price{"new_price"=>"900", new_price"=>"960"} как это добавить?

3. Хорошо, я получаю из приведенных выше записей типа file_data = [{"user_id"=>"101", "dept_id"=>"01", "price"=>"950", "first_name"=>"ajit", "last_name"=>"shinde"}, {"user_id"=>"102", "dept_id"=>"02", "price"=>"950", "first_name"=>"vikas", "last_name"=>"patil"}, {"user_id"=>"103", "dept_id"=>"03", "price"=>"950", "first_name"=>"rohit", "last_name"=>"patel"}] это запись db, и я хочу добавить new_price к каждой записи в конце данных из csv_data = [{"user_id"=>"101", "date"=>"2020-08-13", "new_price"=>"1000"}, {"user_id"=>"102", "date"=>"2020-08-13", "new_price"=>"800"}]

4. in query .first не работает во втором запросе. задана только одна запись. и я попытался получить каждого пользователя с недавней записью.