有许多通过两种模型

Has Many Through two models

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

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返回一个空数组。

我想你可以这样试试

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代表任务的对象class,所以我在图像关联上添加了一个条件。

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\" = ?"

A belongs_to association sets up a one-to-one connection with another model [...]

看起来你可以让你的图像 table 有一个 mission_id 而不是 user_idtrip_id 从那时起你可以简单地说

  • Image belongs_to Mission
  • Mission has_many Images
  • User has_many Images through Mission
  • Trip has_many Images through Mission