中间表列由ransack

时间:2017-10-08 05:59:24

标签: ruby-on-rails ruby

images

我刚开始学习编程,这是我第一次尝试开发网页。

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并对此进行编码。似乎没有什么效果......

非常感谢您的支持!

1 个答案:

答案 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 %>