Как преобразовать SQL-запрос в рельсы? - PullRequest
0 голосов
/ 24 сентября 2018

Я новичок в 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

Ответы [ 2 ]

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

Я использовал запрос, подобный следующему.Но у меня есть несколько проблем.

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">]

Как мы можем решить эти проблемы?

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

Вы должны лучше организовать ассоциации объектов.Объекты, очевидно, имеют какие-то отношения.Как модель Radgr и модель Na.Я думаю, что вы можете установить связь между этими двумя, поэтому позже вы можете использовать команду запроса all = Radgr.includes(:nas).where("nas.realipaddr =?", "192.168.22.175") или что-то подобное.

Также здесь есть хороший сайт для преобразования SQL в запрос ActiveRecord, но здесь вам нужно создать свои модели и ассоциации для тестирования.Пожалуйста, проверьте: http://www.scuttle.io/

...