我目前正在使用Ruby on Rails开发一个Web应用程序。我有一个控制器,它有两个参数:city
和:sub_category
。
我有一个名为InterestPoint
的模型,它属于SubCategory
和City
使用我在网上看到的内容,我最终会这样做以列出与城市和类别匹配的所有InterestPoint
:
class SubCategoryController < ApplicationController
def index
@city = City.where(route_str: params[:city]).first
@sub_category = SubCategory.where(route_str: params[:sub_category]).first
@interest_point = InterestPoint.where(city_id: @city.id).where(sub_category_id: @sub_category.id)
end
end
我的模特:
class SubCategory < ActiveRecord::Base
has_many :interest_points
end
class City < ActiveRecord::Base
has_many :interest_points
end
class InterestPoint < ActiveRecord::Base
belongs_to :sub_category
belongs_to :city
end
以下是相关路线:
get '/:city/:sub_category/' => 'sub_category#index'
它运行良好,但RubyMine(我的IDE)一直告诉我这是一个不好的做法:每个控制器只应使用一个模型。
所以,我的问题是,为什么这是一种不好的做法,我怎么能以“正确的方式”做到这一点?
我的答案基于khaled_gomaa:
第1步,从SubCategory Controller转移到InterestPoint Controller,因为它是页面的内容。
第2步,在我的InterestPoint模型中创建了范围:
scope :by_location, lambda { |str|
joins(:city).where('cities.route_str = ?', str)
}
scope :by_category, lambda { |str|
joins(:sub_category).where('sub_categories.route_str = ?', str)
}
第3步,向我的InterestPoint Controller添加了索引操作:
def index
@interest_points = InterestPoint.by_location(params[:city]).by_category(params[:sub_category]).load
end
答案 0 :(得分:1)
根据我从你那里得到的东西。
所以你会有类似的东西
class InterestPointsController < ApplicationController
def index
@interest_point = InterestPoint.located(params[:city]).categorized(params[:sub_category])
end
end
在位置和分类中的位置是兴趣点模型中的范围