【问题标题】:Has Many Through two models有很多通过两个模型
【发布时间】:2015-02-03 18:39:00
【问题描述】:

我在这里有两个重要的模型。还有更多模型与它们交互,但只有这些才是相关的。

class Image < ActiveRecord::Base
  belongs_to :user
  belongs_to :trip
end

class Mission < ActiveRecord::Base
  belongs_to :user
  belongs_to :trip

  # has_many :images, through: :user
end

注释掉的行让我走到了一半,但我想满足图像具有与任务相同的旅行 ID 的附加条件。

  # has_many :images, through: [:user, :trip]

像一些类似的方法有时会使用数组,这是无效的语法。

   def images
     Image.where(user_id: user_id, trip_id: trip_id)
   end

我应该这样做吗?或者有更好的方法吗?我也尝试在 has_many 上使用条件,但我放在那里的任何动态都被取消Image::ActiveRecord_Relation

以下是一些示例记录:

<User id=1>
<User id=2>
<Trip id=1>
<Trip id=2>
<Image id=1, user_id=1, trip_id=1>
<Image id=2, user_id=1, trip_id=1>
<Image id=3, user_id=1, trip_id=1>
<Mission id=1, user_id=1, trip_id=1>
<Mission id=2, user_id=2, trip_id=1>
<Mission id=3, user_id=2, trip_id=2>

所以Mission.find(1).images 会返回 3 个图像,而 2 和 3 会返回一个空数组。

【问题讨论】:

  • 你要连接多少个模型?形象、使命、用户、旅行?这 4 种类型有什么关系?
  • User 和 Trip 是简单的模型,除了 ID 之外没有其他列。 Image 和 Mission 都有属于用户和旅行的关系。我想获得与任务相同的两个属于关联的图像。所以Mission.find(1).images 应该返回具有相同 user_id 和 trip_id 的图像。如果我只需要它们匹配 user_id 那么我可以简单地做has_many :images, through: :user

标签: ruby-on-rails has-many-through


【解决方案1】:

我觉得你可以这样试试

class Mission < ActiveRecord::Base
    belongs_to :user
    belongs_to :trip
    has_many :images, ->(obj) { where("#{Image.quoted_table_name}.trip_id = ?", obj.trip_id)}, through: :user
    # or
    has_many :images, ->(obj) { where("#{Image.quoted_table_name}.user_id = ?", obj.trip_id)}, through: :trip
end

这个 obj 代表 Mission 类的对象,所以我在图像关联上又添加了一个条件。

Mission.first.images.to_sql
#=> "SELECT \"images\".* FROM \"images\" INNER JOIN \"users\" ON \"images\".\"user_id\" = \"users\".\"id\" WHERE (\"images\".trip_id = 1) AND \"users\".\"id\" = ?"

【讨论】:

  • 我认为这不是我要找的,我正在更新我的问题以尝试更清楚
  • 效果很好!不过有一件事,我将其简化为 has_many :images, -&gt;(obj) { where(trip_id: obj.trip_id) }, through: :user
  • @TMP 谢谢,:) 我添加 'Image.quoted_table_name' 只是为了消除trip_id 的歧义,因为用户表下的同一列,我们将其加入到查询中。
【解决方案2】:

belongs_to 关联建立与另一个模型的一对一连接 [...]

看起来你可以让你的图像表有一个mission_id而不是user_id和trip_id,从那时起你可以简单地说

  • 图片belongs_to使命
  • 任务has_many 图片
  • 用户has_many图片through任务
  • 旅行has_many 图片through 使命

【讨论】:

  • 这是我开始的,但我改变了它,因为在某些情况下我希望图像的 trip_id 为 nil,例如用户的个人资料图片。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多