如何在ActiveRecord中创建与Join Table中的Attributes的关系

时间:2016-01-25 16:16:42

标签: ruby ruby-on-rails-4 activerecord rails-activerecord

我有4个表如下所示:

User:
-id
-name
....

UserMapLayer:
-id
-auto_refresh
....

SystemLayer:
-id
-Name
-Path

UserLayer:
-id
-Name
-Path

我想通过我的用户对象进行查询,该对象将为我提供以下JSON结构中的所有SystemLayer和UserLayer对象

[{layer_id: UserMapLayer.id, name: **THE NAME FROM SystemLayer or UserLayer**, path: **THE PATH FROM SystemLayer or UserLayer**, auto_referesh: UserMapLayer.auto_refresh, source: *'SYSTEM' or 'USER' depending on the whether the record is from SystemLayer or UserLayer*}, {....}]

正如您所看到的,我想在UserMapLayer中存储一些属性,但我不想在连接表中复制名称,路径等内容。

我对Rails和ActiveRecord相当新,并且有ZERO想法如何将模型相互映射......这是我的第一次传递......

class User < ActiveRecord::Base
  has_many :user_map_layers
end

class UserMapLayer < ActiveRecord::Base
  belongs_to :user
  belongs_to :user_layers
  belongs_to :system_layers
end

class UserLayer < ActiveRecord::Base
  has_many :user_map_layers
end

class SystemLayer < ActiveRecord::Base
  has_may :user_map_layers
end

我收到了大量不同的错误,但基本上我甚至都不知道从哪里开始。我甚至不知道如何用谷歌搜索这类问题。我可以在一个直接的SQL Union查询中编写这个查询,所以我想我试图在ActiveRecord中复制它。

我想我正在尝试使用ActiveRecord执行以下SQL查询:

SELECT ul.name, ul.path, uml.auto_refresh from user_layers ul, user_map_layers uml where  
uml.layer_id = ul.id and uml.type = 'USER' and uml.user_id = 1
UNION
SELECT sl.name, sl.path, uml.auto_refresh from system_layers sl, user_map_layers uml where 
uml.layer_id = sl.id and uml.type = 'SYSTEM' and uml.user_id = 1

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

欢迎使用Rails!当您不知道要搜索的内容时,可能很难制定搜索查询!

您正在使用ActiveRecord关联,因此您需要完全熟悉ActiveRecords Association指南以及顶部导航栏中“指南索引”弹出窗口中提供的相关指南。尽可能地坚持官方消息来源,因为多年来模型定义和关联已经发展很多,以提高安全性,所以旧的教程,示例,甚至书籍都会告诉你如何看待以前如何完成,但是可以得到在今天的控制器行动中的无声失败。这些指南真的是一种很好的方式,可以从中获得必要的基础理解,从中发展出真正完整的应用程序。