Ruby on rails 通过两个模型有很多

Ruby on rails 通过两个模型有很多,ruby-on-rails,has-many-through,Ruby On Rails,Has Many Through,我这里有两个重要的模型。还有更多的模型与它们交互,但只有这些模型才是相关的 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 使用类似于某些类似方法的数组

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

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
使用类似于某些类似方法的数组有时是无效的语法

   def images
     Image.where(user_id: user_id, trip_id: trip_id)
   end
我应该那样做吗?还是有更好的方法?我还尝试了has\u many上的条件,但是我在那里放置的任何动态内容都被取消了
Image::ActiveRecord\u关系

以下是一些示例记录:

<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

我想你可以这样试试

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

我想你可以这样试试

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

我想你可以这样试试

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
“属于”关联与另一个模型建立一对一连接[…]

看起来让图像表具有
mission\u id
而不是
user\u id
trip\u id
会让您受益匪浅,因为您可以简单地说

  • 图像
    属于任务
  • 任务
    有许多图像
  • 用户通过任务拥有许多图像
  • Trip
    有许多通过任务的
    图像
“属于”关联与另一个模型建立一对一连接[…]

看起来让图像表具有
mission\u id
而不是
user\u id
trip\u id
会让您受益匪浅,因为您可以简单地说

  • 图像
    属于任务
  • 任务
    有许多图像
  • 用户通过任务拥有许多图像
  • Trip
    有许多通过任务的
    图像
“属于”关联与另一个模型建立一对一连接[…]

看起来让图像表具有
mission\u id
而不是
user\u id
trip\u id
会让您受益匪浅,因为您可以简单地说

  • 图像
    属于任务
  • 任务
    有许多图像
  • 用户通过任务拥有许多图像
  • Trip
    有许多通过任务的
    图像
“属于”关联与另一个模型建立一对一连接[…]

看起来让图像表具有
mission\u id
而不是
user\u id
trip\u id
会让您受益匪浅,因为您可以简单地说

  • 图像
    属于任务
  • 任务
    有许多图像
  • 用户通过任务拥有许多图像
  • Trip
    有许多通过任务的
    图像

您需要连接多少型号?图像、任务、用户、行程?这四种类型是如何关联的?用户和旅行是简单的模型,除了ID之外没有列。图像和任务都有属于用户和旅行的关系。我想得到的图像,有相同的两个属于协会作为使命。所以
Mission.find(1).images
应该返回具有相同用户id和trip id的图像。如果我只需要它们来匹配一个用户id,那么我可以简单地执行
has-many:images,through::user
您需要连接多少型号?图像、任务、用户、行程?这四种类型是如何关联的?用户和旅行是简单的模型,除了ID之外没有列。图像和任务都有属于用户和旅行的关系。我想得到的图像,有相同的两个属于协会作为使命。所以
Mission.find(1).images
应该返回具有相同用户id和trip id的图像。如果我只需要它们来匹配一个用户id,那么我可以简单地执行
has-many:images,through::user
您需要连接多少型号?图像、任务、用户、行程?这四种类型是如何关联的?用户和旅行是简单的模型,除了ID之外没有列。图像和任务都有属于用户和旅行的关系。我想得到的图像,有相同的两个属于协会作为使命。所以
Mission.find(1).images
应该返回具有相同用户id和trip id的图像。如果我只需要它们来匹配一个用户id,那么我可以简单地执行
has-many:images,through::user
您需要连接多少型号?图像、任务、用户、行程?这四种类型是如何关联的?用户和旅行是简单的模型,除了ID之外没有列。图像和任务都有属于用户和旅行的关系。我想得到的图像,有相同的两个属于协会作为使命。所以
Mission.find(1).images
应该返回具有相同用户id和trip\id的图像。如果我只需要它们匹配一个用户id,那么我可以简单地执行
has\u many:images,through::user
我不认为这是我要找的,我正在更新我的问题,以尝试更清晰的作品很棒!不过有一件事,我把它简化为,
有很多:图像,->(obj){where(trip\u id:obj.trip\u id)},通过::user
@TMP谢谢,:)我添加了“Image.quoted\u table\u name”只是为了消除trip\u id的歧义,因为在users表下有相同的列,我们在查询中加入了它。我不认为这是我要找的,我正在更新我的问题,尝试变得更清晰,很棒!不过有一件事,我把它简化为,
有很多:图像,->(obj){where(trip\u id:obj.trip\u id)},通过::user
@TMP谢谢,:)我添加了“Image.quoted\u table\u name”只是为了消除trip\u id的歧义,因为同一列在users表下,我们在我们的