Has_many через параметр в Rails 5 - PullRequest
3 голосов
/ 18 мая 2019

Я изо всех сил пытаюсь управлять таблицей соединений, у которой есть целое число, цель которого - использовать его в качестве индекса или метки для связанных записей. Допустим, таблица соединения равна

class Pair < ActiveRecord::Base
  belongs_to :owner
  belongs_to :element 
  validates_presence_of :position
end

С подразумеваемой настройкой

class Element < ActiveRecord::Base
   has_many :pairs
   has_many :owners through :pairs  
end

class Owner < ...
   has_many :pairs
   has_many :elements through :pairs
end

и позицией является вес или индекс, который ранжирует элементы, принадлежащие владельцу

Теперь я хочу, на коллекции owner.elements:

  1. Выберите ровно один элемент с заданным значением position.
  2. используйте owner.elements<< для создания нового соединения между известным элементом и владельцем, но в то же время присваивайте ссылке вес / позицию.

Единственная мысль, которую мне удалось потренировать, - это игнорировать и работать напрямую с join_table, перегружая оператор [] для него сахаром. Можно было бы ожидать, что существует какое-то более рациональное решение, возможно, с использованием областей с параметрами, но я не понимаю, как я мог бы передать атрибут позиции операциям create или <<.

Учитывая, что элемент отлично идентифицирован владельцем и положением, решение с каким-то динамическим параметром в has_one through также будет допустимым.

Ответы [ 2 ]

3 голосов
/ 22 мая 2019

Я думаю, вы должны попробовать какой-нибудь сухой и чистый подход, определив область действия вашей модели.

scope :by_position, ->(element) { joins(:pairs).where(pairs: { position: element.position}) }

Дать вам представление не о том, что именно вы хотите сделать, но я надеюсь, что это приведет к вашемутребования.

3 голосов
/ 18 мая 2019

Запросы просты

owner.elements.where(pairs: { position: 1 })

добавление также

element = Element.new(name: ...)
owner.pairs << Pair.create(element: element, position: 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...