我刚开始学习编程,这是我第一次尝试开发网页。
rails5.0.2 ruby 2.4.1
gem' ransack' 1.8.3
我的最终目标是创建一个可以从饮料数量中搜索菜单的表单。 没有中间表(所有列的单个表),我做到了。但是,中级表.......
我有3个型号(菜单,MenuDrink和Drink)。
--------- model ------------
class Menu < ApplicationRecord
has_many :menu_drinks
has_many :drinks, through: :menu_drinks
scope :select_drink, -> (drink) {
joins(:menu_drinks, :drinks).select("menus.*, menu_drinks.*, drinks.*").where("drink_name=?", drink)
}
class << self
def ransackable_scopes(auth_object = nil)
[:drink]
end
end
end
class MenuDrink < ApplicationRecord
belongs_to :menu
belongs_to :drink
end
class Menu < ApplicationRecord
has_many :menu_drinks
has_many :menus, through: :menu_drinks
end
------------- schema --------------
create_table "menus", force: :cascade do |t|
t.string "menu_name"
end
create_table "menu_drinks", force: :cascade do |t|
t.integer "menu_id"
t.integer "drink_id"
t.integer "quantity"
end
create_table "drinks", force: :cascade do |t|
t.string "drink_name"
end
------------ controller ------------
class MenusController < ApplicationController
def index
@q = Menu.ransack(params[:q])
@menus = @q.result(distinct: true)
@option = [0,1,2,3,4,5]
end
end
------------ index.html.erb ----------
<%= search_form_for(@q, url: menus_index_path, enforce_utf8: false) do |f| %>
<div class="form-group">
<%= f.label :select_drink_quantity_eq, coke %>
<%= f.select :select_drink_quantity_eq, @option %>
<%= f.submit %>
</div>
<% end %>
我试图首先使用ActiveRecord对象来处理这个问题,但它没有用完。我发现范围可以解决这个问题,所以我研究SQL并对此进行编码。似乎没有什么效果......
非常感谢您的支持!
答案 0 :(得分:0)
您可以不使用ransackable_scopes按饮料数量搜索菜单,只需使用ransack associations,假设您只想显示具有特定饮品数量的所有菜单名称。 例如,如果搜索5,这将显示至少有一个饮料,数量为5
的所有菜单--------- model ------------
class Menu < ApplicationRecord
has_many :menu_drinks
has_many :drinks, through: :menu_drinks
end
class MenuDrink < ApplicationRecord
belongs_to :menu
belongs_to :drink
end
class Menu < ApplicationRecord
has_many :menu_drinks
has_many :menus, through: :menu_drinks
end
------------ index.html.erb ----------
<%= search_form_for(@q, url: menus_index_path, enforce_utf8: false) do |f| %>
<div class="form-group">
<!-- select the drinks dropdown -->
<%= f.label :menu_drinks_quantity_eq, 'Select drink' %>
<%= f.select :menu_drinks_drink_id_eq, Drink.all.collect {|d| [d.drink_name, d.id]} %>
<!-- search the quantity dropdown -->
<%= f.label :menu_drinks_quantity_eq, 'Select quantity' %>
<%= f.select :menu_drinks_quantity_eq, @option %>
<%= f.submit %>
</div>
<% end %>
-- then looping through the @menus --
<%@menus.each do |menu| %>
<%= @menu.menu_name %>
<%end %>