Rails4正在做无意义的查询
我正在构建一个应用程序来管理每周的食物。我的代码工作正常,但做无谓的查询Rails4正在做无意义的查询
的菜(如沙拉)
class Dish < ActiveRecord::Base
validates :name, presence: true, uniqueness: true
has_many :dish_schedule_day_times, dependent: :destroy
has_many :schedule_day_times, through: :dish_schedule_day_times
end
白天晚上一样,早上例如
class ScheduleDayTime < ActiveRecord::Base
validates :name, presence: true, uniqueness: true
validates :position, presence: true, uniqueness: true
belongs_to :dish_schedule_day_time
end
和联想(你可以在早上吃沙拉,晚上...)
class DishScheduleDayTime < ActiveRecord::Base
belongs_to :dish
belongs_to :schedule_day_time
end
我有一个简单的形式来创建一个菜
<div class="form-group">
<%=f.label :name, class: 'control-label' %>
<%=f.text_field :name, class: 'form-control' %>
</div>
<div class="form-group">
<%=f.label :schedule_day_time_ids, class: 'control-label' %>
<%=f.collection_check_boxes :schedule_day_time_ids, ScheduleDayTime.all, :id, :name %>
</div>
的控制器创建方法
def create
@dish = Dish.new
@dish.attributes = dish_params
render :new and return unless @dish.save
end
private
def dish_params
params.require(:dish).permit(:name, :public, schedule_day_time_ids: [])
end
现在在日志
(0.2ms) BEGIN
Dish Exists (0.5ms) SELECT 1 AS one FROM `dishes` WHERE (`dishes`.`name` = BINARY 'test' AND `dishes`.`user_id` = 1) LIMIT 1
ScheduleDayTime Exists (0.6ms) SELECT 1 AS one FROM `schedule_day_times` WHERE (`schedule_day_times`.`name` = BINARY 'Frühstück' AND `schedule_day_times`.`id` != 1) LIMIT 1
ScheduleDayTime Exists (0.8ms) SELECT 1 AS one FROM `schedule_day_times` WHERE (`schedule_day_times`.`position` = BINARY 1 AND `schedule_day_times`.`id` != 1) LIMIT 1
SQL (0.6ms) INSERT INTO `dishes` (`name`, `user_id`, `created_at`, `updated_at`) VALUES ('test', 1, '2016-03-07 19:27:27', '2016-03-07 19:27:27')
SQL (0.4ms) INSERT INTO `dish_schedule_day_times` (`schedule_day_time_id`, `dish_id`, `created_at`, `updated_at`) VALUES (1, 1, '2016-03-07 19:27:27', '2016-03-07 19:27:27')
(1.4ms) COMMIT
被混淆查询是ScheduleDayTime Exists
检查。我不想创建一个ScheduleDayTime
,我没有看到任何实现这样做。为什么ActiveRecord
正在寻找一个独特的ScheduleDayTime
?
更新:
如何防止它?
这些查询由幕后rails
触发,以确保您的validations
得到满足。
你的情况:
盘存在被validates :name, presence: true, uniqueness: true
在Dish
模型触发。
ScheduleDayTime Existing由您的ScheduleDayTime
模型中的每个validates :name, presence: true, uniqueness: true
和validates :position, presence: true, uniqueness: true
触发。
多数民众赞成在意见,但为什么?我没有创建'ScheduleDayTime'。我只是选择现有的'ScheduleDayTime',并通过'schedule_day_time_ids'将它推到'Dish' – rob
这些查询来自您在'ScheduleDayTime'类上的'validates:name'和'validates:position',类似的实现可以在'Dish'类的'validates:name'中看到。您正在保存一条新记录,并且您的要求是确保'Dish'和'ScheduleDayTime'中的三个属性有效,额外的查询,一个用于'Dish Exists',另一个用于执行'ScheduleDayTime Exists'。 – vee