Как написать `has_many: through` с областью действия, которая ссылается на сквозную таблицу? - PullRequest
0 голосов
/ 09 октября 2019

Как я могу написать :has_many связь с предложением where, которое ссылается на другую таблицу, которую я также могу использовать с :includes?

Грубо говоря, код, который мне нужен, приведен ниже:

class User < ActiveRecord::Base
  has_many :as, -> {
    where('as.x >= bs.date_start and as.x <= bs.date_end')
  }, through: :bs
end

Это работает, когда я создаю конкретную модель. Например,

> u = User.find(1)
> u.as.to_a
[...] # I get results I want

Однако я не могу использовать :includes в этой ассоциации:

> User.includes(:as).where(id: [1])
ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'as.x' in 'where clause': SELECT `bs`.* FROM `bs` WHERE (as.x >= bs.date_start and as.x < bs.date_end) AND `bs`.`id` IN (1)

Как я могу переписать свой код, чтобы я мог использовать :includes в своей ассоциации?


РЕДАКТИРОВАТЬ: Я пытался переписать ассоциацию, как это, но это не сработало:

has_many, :as, -> (b) {
  where('as.x >= ? and as.x <= ?', b.date_start, bs.date_end)
}, through: bs

> u = User.find(1)
> u.as
NoMethodError: undefined method 'date_start' for #<User:...>

1 Ответ

1 голос
/ 09 октября 2019

Я думаю, вам нужно добавить .references(:as), если вам это нужно в вашем запросе. User.includes(:as).references(:as).where(id: [1])

https://apidock.com/rails/ActiveRecord/QueryMethods/references

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...