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

У меня в приложении 2 таблицы: 1. Пользователи, 2. Рестораны. Пользователь может сохранять названия (наряду с другими атрибутами) ресторанов, в которых он был. Например, пользователь 1 был в Panda Express и Red Robins. В этих записях о ресторанах также есть «категория еды» в качестве атрибута записи. Когда другой пользователь (пользователь 2) попадает на страницу профиля пользователя 1, появляется столбец, в котором перечислены различные категории блюд ресторана для пользователя 1 (например, американские и китайские).

Что я хочу сделать, так это разрешить пользователю 2 нажимать на категории продуктов питания, чтобы фильтровать и отображать только рестораны в категории, на которую нажали. (вместо того, чтобы показывать все рестораны, если пользователь 2 нажимает на китайский язык, отображается только Panda Express.)

как передать параметр категории еды в модель ресторанов, чтобы отфильтровать результаты?

--

Users table: user_id | name | email

1 | Bob | [email protected]
2 | Alice | [email protected]

Users restaurants table: users_restaurants_id | food_category | user_id

1 | Chinese | 1
2 | American | 1

Restaurants Table: restaurant_id | name | food_category | user_id

1 | Panda Express | Chinese | 1
2 | Red Robins | American | 1

--

Users Show view

<%= for each @restaurants do |r| %>
<%= link_to r.name, url => { :controller => users, :action => show, :xxx => r.id }
<% end %>

Users controller

def show
  @user = User.find(params[:id])
  whichfoodcategory => params(:xxx)
  unless whichfoodcategory.nil?
    #just render all restaurants for all food categories
    @restaurants = @user.restaurants
  else
    #use the params(:xxx) to filter the restaurants model records for @user... but how?
    @restaurants = @user.filteredbyfoodcategory
  end
end

Restaurants Model
attr_accessor :xxx(?) or :whichfoodcategory(?)
named_scope :filteredbyfoodcategory { select all where user_id = 1 and food_category = :whichfoodcategory? or xxx? }

--

Я уверен, что мне следует использовать named_scope в модели «Рестораны», но я не уверен, как передать в модель категорию еды.


person thedeepfield    schedule 16.12.2010    source источник


Ответы (1)


Вот как вы можете загрузить все рестораны только с вашей существующей настройкой.

@restaurants = @user.restaurants.all(:conditions => ["restaurants.food_category = ?", params[:xxx]])

Если вы хотите изменить это на named_scopes, возможно, сработает что-то вроде этого:

class Restaurant < ActiveRecord::Base
  ...
  named_scope :by_food_category, lambda { |category| { :conditions => ["restaurants.food_category = ?", category] } }
end

а затем в контроллере:

@restaurants = @user.restaurants.by_food_category(params[:xxx])
person DanneManne    schedule 16.12.2010