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

更新:

如何防止它?

+3

这些查询来自您在'ScheduleDayTime'类上的'validates:name'和'validates:position',类似的实现可以在'Dish'类的'validates:name'中看到。您正在保存一条新记录,并且您的要求是确保'Dish'和'ScheduleDayTime'中的三个属性有效,额外的查询,一个用于'Dish Exists',另一个用于执行'ScheduleDayTime Exists'。 – vee

这些查询由幕后rails触发,以确保您的validations得到满足。

你的情况:

盘存在被validates :name, presence: true, uniqueness: trueDish模型触发。

ScheduleDayTime Existing由您的ScheduleDayTime模型中的每个validates :name, presence: true, uniqueness: truevalidates :position, presence: true, uniqueness: true触发。

+0

多数民众赞成在意见,但为什么?我没有创建'ScheduleDayTime'。我只是选择现有的'ScheduleDayTime',并通过'schedule_day_time_ids'将它推到'Dish' – rob