Конвертировать SQL-запрос в Rails - PullRequest
2 голосов
/ 15 июля 2010

В данный момент я выполняю свои сложные запросы, так сказать.Но я продолжаю сталкиваться с проблемами.Например.

          query = "SELECT histories.candidate_id 
          FROM histories 
          WHERE histories.institution_id IN (?) 
          GROUP BY histories.candidate_id 
          HAVING COUNT(*)= ?"
          cand = [Code.find_by_sql([query,

params ['поиски'] [ключ], params ['поиски'] [ключ] .size])]

class History < ActiveRecord::Base
  belongs_to :candidate
end
  create_table "histories", :force => true do |t|
    t.string   "job_title"
    t.date     "start_date"
    t.date     "finish_date"
    t.string   "basic_salary"
    t.string   "bonus"
    t.integer  "institution_id"
    t.integer  "candidate_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
class Candidate < ActiveRecord::Base
  # has_and_belongs_to_many :codes
  has_many :codes, :through => :CandidatesCodes
  has_many :histories
  has_many :contacts
  has_many :compensations
end

Это возвращает список идентификаторов кандидатов ... но я хочу, чтобы он возвращал список кандидатов, как бы я поступил таким образом?

Это предложение Бриана, и я пробовал это, но я получаюнеинициализированная константа История :: Кандидаты

      cand = History.find(:all,
        :joins => :candidates,
        :select => "candidates.*",
        :conditions => [ "institution_id IN (?)", params['searches'][key] ],
        :group => [ "candidate_id HAVING count(*) = ?", params['searches'][key].size ]
      )

Ответы [ 3 ]

1 голос
/ 15 июля 2010

Дайте этому попытку (опираясь на описанный выше подход Динеша:

candidates = History.find(:all,
  :joins => :candidates,
  :select => "candidates.*"
  :conditions => ["institution_id IN (?)", params['searches'][key]],
  :group => ["candidate_id HAVING count(*) = ?", params['searches'][key].size]
)

Предупреждение - не проверено.

1 голос
/ 16 июля 2010

Попробуйте это:

Candidate.all(
  :joins => :histories,
  :conditions => {:histories=> {:institution_id => params[:searches][key]}},
  :group => "candidates.id",
  :having => "count(candidates.id) >= %i" % params[:searches][key].size
)

Это должно сгенерировать следующий SQL:

SELECT   candidates.*
FROM     candidates AS candidates
JOIN     histories AS histories ON histories.candidate_id = candidates.id
WHERE    histories.institution_id IN (1,2,3)
GROUP BY candidates.id
HAVING   COUNT(candidates.id) >= 3
0 голосов
/ 15 июля 2010

Попробуйте это.

Предполагая, что у вас есть режим истории

History.find(:all ,
    :conditions=>[" institution_id IN (? ) ",params['searches'][key] ],
    :group => ["candidate_id  HAVING count(*) = ? " ,params['searches'][key].size ]
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...