2016-03-07 55 views
0

我正在構建一個應用程序來管理每週的食物。我的代碼工作正常,但做無謂的查詢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

回答

1

這些查詢由幕後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