将SQL语句转换为Ruby on Rails

oma*_*oum 0 ruby sql-server ruby-on-rails sql-server-2008 ruby-on-rails-3

我有两个表,我想比较它们之间的数据,并从一个表中挑选出另一个表中没有的数据.我已经有一个在SQL Server Management中工作的代码,但我需要将其转换为Rails,或者我需要能够在我的代码中使用原始SQL代码.这是代码:

select * from app_servers
where not exists 
( select app, environment, server 
            from stagings
            where stagings.server = app_servers.server_id
            AND
            stagings.environment = app_servers.environment_id 
            AND 
            app_servers.app_id = stagings.app
)
Run Code Online (Sandbox Code Playgroud)

提前致谢

Boh*_*dan 6

你为什么要转换它?您可以按原样使用它

AppServer.where(" not exists 
      ( select app, environment, server 
        from stagings
        where stagings.server = app_servers.server_id
        AND
        stagings.environment = app_servers.environment_id 
        AND 
        app_servers.app_id = stagings.app
      )
")
Run Code Online (Sandbox Code Playgroud)


nat*_*vda 5

如果我理解正确,你有两个模型,AppServer并且Staging都有一个环境,服务器和一个应用程序.你正在寻找AppServer没有相应的Staging.

所以你的模型看起来像:

class AppServer
  belongs_to :server
  belongs_to :environment
  belongs_to :app
end

class Staging
  belongs_to :server
  belongs_to :environment
  belongs_to :app
end
Run Code Online (Sandbox Code Playgroud)

但实际上你想要的是类似的东西

class AppServer 
  belongs_to :server
  belongs_to :environment
  belongs_to :app
  has_one :staging
end
Run Code Online (Sandbox Code Playgroud)

哪个真的很容易测试.就像是:

AppServer.where(:staging_id => nil)
Run Code Online (Sandbox Code Playgroud)

因此,您可以考虑改进数据模型以使其更容易.这不会太难:添加一个列,并为每个app_server找到相应的staging.

但是假设您无法控制数据模型,那么您需要编写类似的内容

class AppServer
  has_many :stagings, finder_sql => 'select * from stagings where server=#{server_id} and environment=#{environment_id} and app=#{app_id}'
Run Code Online (Sandbox Code Playgroud)

注意:你必须使用单引号!! 这至少可以让你访问类似的东西

app_server = AppServer.first
app_server.stagings
Run Code Online (Sandbox Code Playgroud)

不幸的是,它不允许你写类似的东西

AppServer.where(:stagings => nil)
Run Code Online (Sandbox Code Playgroud)

要查找所有AppServer没有分段的内容,并且您无法转换架构,您将需要执行类似的操作

AppServer.where(" not exists 
  ( select app, environment, server 
    from stagings
    where stagings.server = app_servers.server_id
    AND
    stagings.environment = app_servers.environment_id 
    AND 
    app_servers.app_id = stagings.app
  )"
)
Run Code Online (Sandbox Code Playgroud)

实际上,最后,我没有找到使用arel的新方法.但我确实展示了一些允许使用某些rails助手的方法,其次,如果可能的话(甚至使用视图),它似乎是一种很好的方法,可以将您的数据模型转换为更友好的轨道模型.一个很好的理由是创建数据模型的rails方式实际上是一种非常好的方式.