У меня три модели: Foo, Bar и Profile. Первые две модели ссылаются на Profile.

Я хотел бы присоединиться к Foo и Bar без необходимости присоединяться к профилю, например.

class Foo < ApplicationRecord
  belongs_to :profile
end

class Bar < ApplicationRecord
  belongs_to :profile
end

class Profile < ApplicationRecord
end

SQL будет выглядеть примерно так:

SELECT *
FROM foo 
INNER JOIN bar ON foo.profile_id = bar.profile_id

Я мог бы сделать следующее, но я не хочу присоединяться к Profile, так как это гораздо больший стол.

Foo.joins(profile: :bar)
0
Stefan Collier 22 Ноя 2021 в 21:23
Что такое bar в этом контексте? В настоящее время вы дважды публикуете одну и ту же модель Foo, одна из них должна была быть Bar?
 – 
engineersmnky
23 Ноя 2021 в 00:55
Привет, @engineersmnky, да, это так. Прости за это.
 – 
Stefan Collier
23 Ноя 2021 в 17:58
От Foo к Bar один ко многим, один к одному или многие ко многим? Какое здесь реляционное измерение?
 – 
engineersmnky
23 Ноя 2021 в 18:04

2 ответа

Лучший ответ
class Foo < ApplicationRecord
  def self.join_bars
    bars = Bar.arel_table
    j = arel_table.join(bars)
                  .on(arel_table[:profile_id].eq(bars[:profile_id]))
    joins(j.join_sources)
  end
end

Вы также можете просто настроить ассоциацию:

class Foo < ApplicationRecord
  belongs_to :profile
  has_many :bars, 
    primary_key: :profile_id, # the column on this table 
    foreign_key: :profile_id  # the column on the other table
  # or for one to one
  has_one :bar, 
    primary_key: :profile_id, # the column on this table 
    foreign_key: :profile_id  # the column on the other table
end

Foo.joins(:bars)
2
max 23 Ноя 2021 в 18:04
Эта вторая часть замечательна, спасибо!
 – 
Stefan Collier
23 Ноя 2021 в 20:11

Вы можете добиться этого, используя необработанный SQL-запрос в joins.

# assuming you have foos and bars tables

Foo.joins("LEFT JOIN bars ON foos.profile_id = bars.profile_id")

Надеюсь, это сработает для вас!

1
Nitin Srivastava 22 Ноя 2021 в 21:39
Спасибо за ответ. Однако я надеялся на подход, отличный от SQL. Я должен был быть более ясным в квесте.
 – 
Stefan Collier
23 Ноя 2021 в 20:12