【问题标题】:How to create relationship in ActiveRecord with Attributes in Join Table如何在 ActiveRecord 中使用联接表中的属性创建关系
【发布时间】:2016-01-25 16:16:42
【问题描述】:

我有 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 还很陌生,并且对如何将模型相互映射一无所知...这是我的第一次通过...

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 联合查询中编写此查询,所以我想我正在尝试在 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

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    欢迎来到 Rails!当您不知道如何称呼您要查找的内容时,可能很难制定搜索查询!

    您正在使用 ActiveRecord 关联,因此您需要完全熟悉 ActiveRecords Association 指南,以及顶部导航栏中“指南索引”弹出窗口中提供的相关指南。尽可能坚持使用官方资源,因为多年来模型定义和关联已经发生了很大的变化以提高安全性,所以旧的教程、示例甚至书籍都会告诉你帮助你了解它过去是如何完成的,但可能会导致在当今控制器操作中的静默失败中。这些指南确实是获得开发真正成熟应用所需的基本知识的绝佳方式。

    【讨论】:

    • 感谢您的链接...这是好东西。我从文档中学到了很多东西!我的问题仍然存在,“我正在尝试做的事情是否现实?”
    • 是的!关键在于在相关表中将一个模型的 id 表示为 main_model_id 之类的东西,因为 ActiveRecord 会创建必要的访问器方法。一定要了解 :has_many :through 模型,因为这样做所有更简单的相关性都更有意义。
    • 当您超越 ActiveRecord Association 的内置功能时,您也知道您可以在模型上创建自己的方法来执行您需要的任何其他操作。例如,我经常在我的模型文件中创建两个方法,一个叫“about”,另一个叫“description”它的弱点是等等。“描述”通常是我正在查看的记录集合的控制台报告。
    • 非常好的建议......我实际上正在开发一个示例应用程序,看看我是否有要点!完成后我会更新!再次感谢!
    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 2015-12-21
    • 2013-06-09
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多