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)
提前致谢
你为什么要转换它?您可以按原样使用它
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)
如果我理解正确,你有两个模型,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方式实际上是一种非常好的方式.
| 归档时间: |
|
| 查看次数: |
798 次 |
| 最近记录: |