【发布时间】:2014-06-20 15:55:55
【问题描述】:
我对 Rails 很陌生,通过搜索找不到类似的情况。我有两个现有的表event 和data:
event 有很多很多列:
+-------------------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+----------------------+------+-----+---------+-------+
| sid | int(10) unsigned | NO | MUL | NULL | |
| cid | int(10) unsigned | NO | | NULL | |
| signature | varchar(255) | NO | MUL | NULL | |
| src_ip | int(10) unsigned | YES | MUL | NULL | |
| dst_ip | int(10) unsigned | YES | MUL | NULL | |
| ... | ... | ... | ... | ... | |
| etc | | | | | |
+-------------------+----------------------+------+-----+---------+-------+
data 只有三个:
+--------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+---------+-------+
| sid | int(10) unsigned | NO | MUL | NULL | |
| cid | int(10) unsigned | NO | | NULL | |
| data_payload | text | YES | | NULL | |
+--------------+------------------+------+-----+---------+-------+
我的模型:
class Event < ActiveRecord::Base
has_one :payload, :foreign_key => 'cid', :primary_key => 'cid'
self.table_name = "event";
[more stuff]
end
class Payload < ActiveRecord::Base
belongs_to :event
self.table_name = "data";
end
使用 has_one 关系,我可以执行如下查询:
Event.limit(5).offset(90000).each do |e|
然后循环并为每次迭代调用e.payload,这将执行如下查询:
SELECT `data`.* FROM `data` WHERE `data`.`cid` = 90001 LIMIT 1
但这显然不是正确的做法。我觉得我在这里打字是在自取其辱。
我认为我理想的查询是这样的:
SELECT `event`.`cid`, `event`.`sid`, `event`.`signature`, `data`.`data_payload`
FROM `event`, `data`
WHERE `event`.`sid` = `data`.`sid` AND
`event`.`cid` = `data`.`cid` AND
`event`.`signature` LIKE 'example_signature'
有没有办法通过适当的 Rails 关联在一个查询中完成所有这些操作?只是想想我将不得不经历的循环才能将最终的 ActiveRecord/hash 对象传递给我的视图,这让我觉得我正在以一种非常迂回的方式来做这件事。
【问题讨论】:
标签: mysql sql ruby-on-rails rails-activerecord has-one