如何将SQL查询转换为Rails?

时间:2018-09-24 17:10:29

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-5

我是ROR的新手。我在下面创建的查询运行正常。我正在准备讯问。但是我没有成功。查询如下;

@rad_user_group.groupname = SELECT groupname FROM radgrs INNER JOIN nas WHERE radgrs.grdefault = true AND radgrs.tenant_id = nas.tenant_id AND nas.realipaddr = "192.168.22.175" AND nas.active = true

在另一个问题中,如何为以下查询设置大小写?如果查询失败,则返回NULL。

感谢您的关心。

def realipaddr
    request.remote_addr
  end

  def create
    @rad_check = RadCheck.new(rad_check_params)
    @rad_check.tenant_id = Na.find_by(realipaddr: realipaddr, active: :true).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

RadCheck模型

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

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.string :realipaddr
      t.string :groupname

      t.timestamps
    end
  end
end

Radgr模型

class Radgr < ApplicationRecord
end

class CreateRadgrs < ActiveRecord::Migration[5.2]
  def change
    create_table :radgrs do |t|
      t.integer :tenant_id
      t.string :groupname
      t.string :realipaddr
      t.boolean :grdefault

    end
  end
end

RadUserGroup模型

class RadUserGroup < ApplicationRecord
  belongs_to :rad_check
end

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

Na模型

class Na < ApplicationRecord
end

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

PhpMyAdmin Query

2 个答案:

答案 0 :(得分:0)

您应该更好地组织对象关联。这些对象显然具有某种关系。 类似于Radgr模型和Na模型。我认为您可以在这两者之间建立联系,因此以后可以使用查询命令<p:outputPanel> <p:inputTextarea id="test"> </p:inputTextarea> </p:outputPanel> <p:draggable for="test" containment="parent" /> 或类似的命令。

这也是一个将SQL转换为ActiveRecord查询的好站点,但是您需要在此处创建模型和关联以进行测试。 请检查: http://www.scuttle.io/

答案 1 :(得分:0)

我使用了如下查询。但是我有一些问题。

self.rad_user_group.groupname = Radgr.select(:groupname).joins(:nas).where(nas: {tenant_id: :tenant_id},nas: {realipaddr: "192.168.22.175"})

我收到了类似控制台发出的警告。

(irb):1: warning: key :nas is duplicated and overwritten on line 1

控制台输出

2.4.1 :001 > Radgr.select(:groupname).joins(:nas).where(nas: {tenant_id: :tenant_id}, nas: {realipaddr: "78.189.33.53"})
(irb):1: warning: key :nas is duplicated and overwritten on line 1
   (0.4ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
  Radgr Load (0.2ms)  SELECT  `radgrs`.`groupname` FROM `radgrs` INNER JOIN `nas` ON `nas`.`tenant_id` = `radgrs`.`id` WHERE `nas`.`realipaddr` = '78.189.33.53' LIMIT 11
 => #<ActiveRecord::Relation [#<Radgr id: nil, groupname: "Testo2">]>

最重要的是,它确实记录了SQL,但是它确实记录了以下内容。

#<Radgr::ActiveRecord_Relation:0x007fbc9c3cb1e8>

如果我在查询的末尾添加.to_a,录音就是这样。

[#<Radgr id: nil, groupname: "Testo2">]

我们如何解决这些问题?