Как добавить запросы между таблицами в Ruby on Rails - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь создать сложную форму.Поля также должны добавлять данные, полученные с запросами, в другие таблицы.

Вот что я пытаюсь сделать.

Форма Rad_check состоит из имени пользователя и пароля ... Когда пользователь регистрируется, вводя имя пользователя и пароль, таблица Rad_cheks должна состоять из других записей на обороте.Я был в состоянии сделать некоторые из модели Radcheck.Однако я хочу условно запросить столбец tenant_id в таблице Nas и вставить его в таблицу Rad_checks.Я фактически подготовил запрос для этого, но я не знаю, как его использовать.

Na.select (: tenant_id) .where (Na.arel_table [: realipaddr] .eq ('форма реальная)ip будет '))

На самом деле, я использую Gem-файл Milia.Тем не менее, будет несколько более публичная форма ... созданный мною запрос должен прийти способом, а не IP-адресом запроса.REMOTE_IP код.Это означает, что фактический IP-адрес пользователя представляет собой информацию tenant_id, равную IP-адресу в таблице NAS.

При сохранении формы Rad_chek я хочу запросить фактический IP-адрес пользователя в таблице Nas и добавитьномер tenant_id равных данных в таблице Rad_cheks.Как я могу это сделать?

Помогите мне!Пожалуйста

ТАБЛИЦА

class CreateRadChecks < ActiveRecord::Migration[5.2]
  def change
    create_table :rad_checks do |t|
      t.integer :tenant_id
      t.string :username
      t.string :password
      t.string :attribu
      t.string :op

      t.timestamps
    end
  end
end

ФОРМА

<%= form_with(model: rad_check, local: true) do |form| %>
  <% if rad_check.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(rad_check.errors.count, "error") %> prohibited this rad_check from being saved:</h2>

      <ul>
      <% rad_check.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :username %>
    <%= form.text_field :username %>
  </div>

  <div class="field">
    <%= form.label :password %>
    <%= form.text_field :password %>
  </div>  

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

МОДЕЛЬ

class RadCheck < ApplicationRecord
    has_one :rad_user_group, dependent: :destroy

    after_initialize :add_rad_user_group
    before_save :set_radcheck   

    def add_rad_user_group
      self.rad_user_group ||= RadUserGroup.new if self.new_record?
    end 


    def set_radcheck
      self.rad_user_group.username = username
      self.op = ":="
      self.attribu = "Cleartext-Password"
    end
end

таблица rad_user_group

class CreateRadUserGroups < ActiveRecord::Migration[5.2]
  def change
    create_table :rad_user_groups do |t|
      t.integer :tenant_id
      t.string :username
      t.string :groupname
      t.references :rad_check, foreign_key: true

      t.timestamps
    end
  end
end

таблица nas

class CreateNas < ActiveRecord::Migration[5.2]
  def change
    create_table :nas do |t|
      t.integer :tenant_id
      t.string :nasname
      t.string :realipaddr
      t.boolean :active

    end
  end
end

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Вот как это работает.Я действительно ценю информацию, которую вы мне дали.Только переменная request.remote_ip возвращает локальный IP-адрес.Интернет-провайдер не дает IP-адрес.Как мне это сделать?

def realipaddr
    request.remote_addr
  end
  # POST /rad_checks
  # POST /rad_checks.json
  def create
    @rad_check = RadCheck.new(rad_check_params)
    @rad_check.tenant_id = Na.find_by(realipaddr: realipaddr).tenant_id

    respond_to do |format|
      if @rad_check.save
        format.html { redirect_to @rad_check, notice: 'Rad check was successfully created.' }
        format.json { render :show, status: :created, location: @rad_check }
      else
        format.html { render :new }
        format.json { render json: @rad_check.errors, status: :unprocessable_entity }
      end
    end
  end
0 голосов
/ 19 сентября 2018

Предполагается:

  • У вас есть переменная с именем realipaddr
  • Нас принадлежит_: арендатор
  • RadCheck Proper_to: арендатор
  • у вас естьсоздание экземпляра переменной с именем @rad_check

Тогда вы сможете сделать что-то вроде:

@rad_check.update(tenant: Nas.find_by(realipaddr: realipaddr).tenant)

Или, если вы не хотите, чтобы save происходил сupdate:

@rad_check.tenant = Nas.find_by(realipaddr: realipaddr).tenant

Если вы создаете экземпляр @rad_check на основе rad_check_params в контроллере, вы можете сделать что-то вроде:

def create
  @rad_check = RadCheck.new(rad_check_params)
  if @rad_check.save
    # do something
  else
    # do something else 
  end
end

def rad_check_params
  params.require(:rad_check).permit(:some, :parameters).merge!(tenant: nas_tenant))
end 

def nas_tenant
  Nas.find_by(realipaddr: realipaddr).tenant
end

Возможно, есть другие способытоже.

...