【问题标题】:How to add queries between tables in Ruby on Rails如何在 Ruby on Rails 中的表之间添加查询
【发布时间】:2018-09-19 14:20:13
【问题描述】:

我正在尝试设计一个复杂的表单。字段还需要将我通过查询收到的数据添加到其他表。

这就是我想要做的。

Rad_check 表格由用户名和密码组成... 当用户通过输入用户名和密码进行注册时,Rad_cheks 表后面必须包含其他记录。我能够做一些 Radcheck 模型。但是,我想有条件地查询 Nas 表中的tenant_id 列并将其插入到 Rad_checks 表中。我实际上已经为此准备了一个查询,但我不知道如何使用它。

Na.select(:tenant_id).where(Na.arel_table[:realipaddr].eq('form's real ip will be'))

实际上,我正在使用 Milia gem 文件。但是,将会有一个更公开的形式......我创建的查询必须以某种方式出现,而不是请求的 IP 地址。 REMOTE_IP 代码。这意味着用户的实际IP地址是tenant_id信息,等于NAS表中的IP地址。

保存Rad_chek表格时,我想在Nas表中查询用户的实际IP地址,并将相等数据的tenant_id号添加到Rad_chek表中。我该怎么做?

帮帮我!请

表格

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

【问题讨论】:

  • 问题是什么?
  • Rad_check 表格由用户名和密码组成... 当用户输入用户名和密码进行注册时,Rad_cheks 表后面必须包含其他记录。我能够做一些 Radcheck 模型。但是,我想有条件地查询 Nas 表中的tenant_id 列并将其插入到 Rad_checks 表中。我实际上已经为此准备了一个查询,但我不知道如何使用它。 Na.select (:tenant_id) .name (Na.arel_table [: realipaddr] .eq ('formun gerçek ipi' olacaktır)) 如何在保存表单时将此查询添加到 teanat_id 分支?
  • 保存Rad_chek表格时,我想在Nas表中查询用户的实际IP地址,并将相等数据的tenant_id号添加到Rad_chek表中。我该怎么做?
  • 您应该添加发生这种情况的控制器操作以及表单提交的参数。
  • 如何向这样的查询添加参数。可以举个例子吗?

标签: ruby-on-rails ruby-on-rails-5 multi-tenant


【解决方案1】:

假设:

  • 您有一个名为realipaddr 的变量
  • Nas belongs_to :tenant
  • RadCheck 属于_to :tenant
  • 您已经实例化了一个名为@rad_check 的变量

那么你应该可以做这样的事情:

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

或者,如果您不希望 saveupdate 一起出现:

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

如果您在控制器中基于rad_check_params 实例化@rad_check,您可能会执行以下操作:

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

可能还有其他方法。

【讨论】:

  • 这就是它的工作原理。我真的很感激你给我的信息。只有变量 request.remote_ip 返回本地 IP 地址。 ISP 不提供 IP 地址。我该怎么做?
【解决方案2】:

这就是它的工作方式。我真的很感激你给我的信息。只有变量 request.remote_ip 返回本地 IP 地址。 ISP 不提供 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

【讨论】:

  • 如果你的关联设置正确,你应该可以做到@rad_check.tenant = Na.find_by(realipaddr: realipaddr).tenant(没有_id)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
相关资源
最近更新 更多