2015-11-02 3 views
0

Я создаю приложения в Ruby, и у меня есть две модели классовЗапросы в contoller- ROR

class Restaurant < ActiveRecord::Base 
    attr_accessible :title, :cuisine, :price_range, :environment 
    self.primary_key = 'title' 
    has_many :environments 
    end 
end 


class Environment < ActiveRecord::Base 
    attr_accessible :title, :type 
    belongs_to :restaurants,foreign_key: 'title' 

end 

Я пытаюсь запросить две таблицы в контроллер- вернуться рестораны с определенными средами.

@restaurants = Restaurant.joins('INNER JOIN environments ON restaurants.title=environments.title').where('environments.env_type'=> @selected_environment) 

Примечание: @selected_environment хэш содержал список сред. В таблице окружения есть список пар для окружающей среды и ресторана (может быть более одного ресторана). Я знаю, что указанный выше запрос неверен для достижения моей цели. Есть ли способ, которым я могу это сделать?

метод контроллера:

def index 

     # can later be moved to the Restaurant model 
     ordering = {:title => :asc} 
     @all_environments = Restaurant.all_environments 

     @selected_environments = params[:environments] || session[:environments] || {} 
     if @selected_environments == {} 
      @selected_environments = Hash[@all_environments.map {|environment| [environment, environment]}] 
     end 
     if params[:environments] != session[:environments] 
      session[:environments] = @selected_environments 
      redirect_to :environments => @selected_environments and return 
     end 
     @restaurants = Restaurant.joins(:environments).where(environments:{env_type: @selected_environments.keys }) 

    end 
+0

Я думаю, что вы смоделировали ваш данные некорректно, и это может быть источником некоторых из ваших проблем. Можете ли вы привести несколько примеров данных? (например, рестораны, среды и отношения между ними?) Кроме того, есть ли какая-то конкретная причина, по которой вы выбрали «название» в качестве основного ключа по idiomatic «id»? –

+0

Да, я ответил на это, но, прочитав это, вы пытаетесь выполнить запрос после того, как кто-то выбрал выбранную среду для ui? – DustinFisher

+0

Да DustinFisher, который является правильным – noob

ответ

1

Для ваших моделей, которые вы хотите сделать это:

class Restaurant < ActiveRecord::Base 
    attr_accessible :title, :cuisine, :price_range, :environment 
    self.primary_key = 'title' 
    has_many :environments, :foreign_key => 'title', :primary_key => 'title' 
end 


class Environment < ActiveRecord::Base 
    attr_accessible :title, :type 
    belongs_to :restaurants, foreign_key: 'title' 
end 

Попробуйте структурировать ваш запрос, как это:

Restaurant.joins(:environments).where(environments: { env_type: @selected_environments.values }) 
+0

Я получаю следующую ошибку SQL lite SQLite3 :: SQLException: нет такого столбца: environment.restaurant_id: SELECT «рестораны». * FROM «рестораны« INNER JOIN »окружающая среда« ON »окружения». «Restaurant_id» = «рестораны» . "title" WHERE "environment". "env_type" IN ('casual', 'outdoor_sitting', 'romantic') – noob

+0

соединение собирает несуществующий restaurant_id вместо заголовка – noob

+0

Я обновил ответ для вашей структуры на вашем моделей. – DustinFisher

Смежные вопросы