【问题标题】:Assembling relations of multiple models in rails - impossible?在导轨中组装多个模型的关系 - 不可能吗?
【发布时间】:2014-06-14 11:35:15
【问题描述】:

假设我有三个模型。

UserToolWork(实际上模型不同,但为简单起见,就是这些家伙)。现在..

User 被赋予ToolTool 一些Work

User has many Tools
every Tool belongs to one User

Tool has many Works
every Work was done with single Tool

我可以成功获得User.tools,但我无法让用户完成工作。

我试过了:

User.tools.each do |tool|
  tool.works.each do |work|
    <%= work.id %>
  end
end

但这并没有完全按预期进行(用户已完成多个 Works 的 id),而是出现错误...

我做错了什么?

【问题讨论】:

  • PG::UndefinedColumn: 错误:列works.tool_id 在字符48 处不存在:SELECT "works".* FROM "works" WHERE "works"."tool_id" = $1
  • 你得到我的答案了吗?我认为你可以走那条路,我描述过。因为您描述需求的方式非常适合 多对多 模型。
  • 是的,非常完美。我的错误是认为 rails 想知道 Works 属于 User。我的错。你知道的越多……

标签: ruby-on-rails ruby activerecord associations models


【解决方案1】:

您可以为同一对象创建一个多对多关联

class User <  ActiveRecord::Base
  has_many :tools
  has_many :tasks , :through => :tools, :source => :works
end

class Tool <  ActiveRecord::Base
  belongs_to :user
  has_many :works
end

class Work <  ActiveRecord::Base
  belongs_to :tool
end

现在你可以这样做了:

@users = User.all
@users.each do |user|
  user.tasks do |task|
    <%= task.id %>
  end
end

确保迁移正确。所有外键/主键关系都应该正确,否则会出现未定义列错误。检查#has_many official doc 以了解我通过has_many 方法调用传递的选项。

【讨论】:

  • 这太完美了!我的错误是认为 rails 想知道 (Tasks) belongs_to :user。你知道的越多……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 2012-07-18
  • 1970-01-01
  • 2015-11-05
相关资源
最近更新 更多