我正在構建一個應用程序來管理每週的食物。我的代碼工作正常,但做無謂的查詢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
?
更新:
如何防止它?
這些查詢來自您在'ScheduleDayTime'類上的'validates:name'和'validates:position',類似的實現可以在'Dish'類的'validates:name'中看到。您正在保存一條新記錄,並且您的要求是確保'Dish'和'ScheduleDayTime'中的三個屬性有效,額外的查詢,一個用於'Dish Exists',另一個用於執行'ScheduleDayTime Exists'。 – vee