【发布时间】:2014-11-15 00:31:17
【问题描述】:
我有一个 PostgreSQL 查询,我正在我的 rails 应用程序中查找。
SQL 查询是:
SELECT *
FROM event
INNER JOIN sensor ON (sensor.sid = event.sid)
INNER JOIN iphdr ON (iphdr.cid = event.cid) AND (iphdr.sid = event.sid);
此查询在 PostgreSQL 中运行良好。我希望它可以帮助我在我的 rails 应用程序中实现更少的 N+1 查找,但我没有成功实现它。
这是我的尝试:
ips_events = Event.joins(:sensor).on(:sensor.sid = :event.sid).joins(:ip_hdr).on(:ip_hdr.cid = :event.cid && :ip_hdr.sid = :event.sid).all.(conditions: ['timestamp >= ?', @ts]).reverse.uniq
我收到“NoMethodError: undefined method `sid' for :event:Symbol”
这是传感器模型:
class Sensor < ActiveRecord::Base
# DB Schema
# sid | hostname | interface | filter | detail | encoding | last_cid
#--------------------------------------------------------------------
attr_accessible :sid, :hostname, :interface, :filter, :detail, :encoding, :last_cid
self.table_name = 'sensor'
belongs_to :event,
:foreign_key => :sid
end
事件模型:
class Event < ActiveRecord::Base
# DB Schema
# sid | cid | signature | timestamp
#----------------------------------
attr_accessible :sid, :cid, :signature, :timestamp
self.primary_keys = :sid, :cid
self.table_name = 'event'
has_many :sensors,
:foreign_key => :sid
has_many :signatures,
:foreign_key => :sig_id,
:primary_key => :signature
has_many :ip_hdrs,
:foreign_key => [:sid, :cid]
has_many :tcp_hdrs,
:foreign_key => [:sid, :cid]
has_many :udp_hdrs,
:foreign_key => [:sid, :cid]
end
这是 ip_hdr 模型:
class IpHdr < ActiveRecord::Base
# DB Schema
# sid | cid | ip_src | ip_dst | ip_ver | ip_tos | ip_len | ip_id | ip_flags | ip_off | ip_ttl | ip_proto | ip_csum
#-----------------------------------------------------------------------------------------------------------------
attr_accessible :sid, :cid, :ip_src, :ip_dst, :ip_ver, :ip_tos, :ip_len, :ip_id, :ip_flags, :ip_off,
:ip_ttl, :ip_proto, :ip_csum
self.primary_keys = :sid, :cid
self.table_name = 'iphdr'
belongs_to :event,
:foreign_key => [:sid, :cid]
end
【问题讨论】:
-
您正在调用 Symbol 对象上的方法,就好像它们是您的 ActiveRecord 模型的实例一样。请参阅guides.rubyonrails.org/… 了解更多信息。您需要发布要加入的模型的源代码,以确保为
join方法定义了正确的关系才能正常工作。
标签: ruby-on-rails ruby ruby-on-rails-3 postgresql