has_many через ассоциацию и множественные критерии поиска, как я могу заставить эту работу работать? - PullRequest
0 голосов
/ 21 сентября 2011

Я пытаюсь создать форму поиска по нескольким критериям.Я хочу отправить все части поиска через GET, и если им присвоено значение, я бы хотел, чтобы они были оценены.Проблема, которую я не могу понять, - это создание запроса, который позволит мне наложить больше запросов сверху, когда вы делаете это с помощью сквозной ассоциации.

Просто чтобы дать вам представление о том, как мои моделинастроены:

class Client < ActiveRecord::Base
  has_many :campaigns
  has_many :pieces, :through => :campaigns
end

class Campaign < ActiveRecord::Base
  belongs_to :client
  has_many :pieces
end

class Piece < ActiveRecord::Base
  belongs_to :client
end

Теперь, имея в виду эту модель, я использую метод сбора, чтобы получить фрагменты, которые имеют общую организацию.

if params.has_key?(:criteria)
    @selected_client = Client.where(:organization => "Org1")
    @pieces = @selected_client.collect{ |c| c.pieces }.flatten
end

Есть ли какой-нибудь способ форматирования этой строки запроса, чтобы я мог сузить @pieces вниз, еще пару раз?Скажем, я хотел использовать это снова через ассоциацию, чтобы получить куски, которые имеют другой такой же критерий клиента ...

Спасибо за тонну!На данный момент мой мозг - крендель.

Ответы [ 2 ]

1 голос
/ 21 сентября 2011

Я не уверен, что я очень хорошо понимаю, что вы пытаетесь сделать. Если вы хотите получить все элементы, соответствующие критериям вашего клиента, в рельсах 3 вы можете сделать это:

@pieces = Piece.joins(:campaign => :client).where(:clients => {:organization => criteria})

чтобы получить все вещи, принадлежащие клиентам, от организации "Орг1".

Вы можете сложить столько операторов where, сколько хотите, чтобы добавить новые условия, как сказал @Andrew. См. Это для получения дополнительной информации .

0 голосов
/ 21 сентября 2011

Ваш первый абзац обрезан, только к вашему сведению.

Если @pieces - это массив, вы можете использовать блок find, чтобы сузить область поиска. Хотя это приведет к загрузке ЦП вашего сервера, а не базы данных SQL.

Вы можете сложить where операторов, и Rails автоматически создаст для вас один запрос. Вот пример кода из раздела магазина приложений на нашем сайте:

@platform = params[:platform]
@category = params[:category]
@search   = params[:app_q]

# Get initial SQL, narrow the search, and finally paginate
@apps = App.live

@apps = @apps.where("platform = ?", AppPlatforms.value(@platform)) if AppPlatforms.value(@platform)
@apps = @apps.where("(name LIKE ? OR description LIKE ?)", "%#{@search}%", "%#{@search}%") if @search
@apps = @apps.where("id IN(?)", @cat.apps) if @category && @cat = Category.find_by_id(@category)

@apps = @apps.paginate(:page => params[:page], :per_page => 10, :order => "name")

Вместо использования collect вы можете использовать @selected_client.pieces.where(...) для сужения поиска с помощью SQL.

Надеюсь, это точка в правильном направлении!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...