NoMethodError: закрытый метод `y 'в ActiveRecord при доступе к атрибуту - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть модель Artboard и группа моделей, которая имеет отношение многие ко многим через таблицу ArtboardsGroups, которая имеет атрибуты для значений x и y, относящихся к отношению

class Artboard < ApplicationRecord
  has_many :artboards_groups, dependent: :destroy
  has_many :groups, -> { select("groups.id as id, groups.name as name, artboards_groups.x as x, artboards_groups.y as y, artboards_groups.index as index, artboards_groups.r as r") }, through: :artboards_groups
end

class ArtboardsGroup < ApplicationRecord
  belongs_to :artboard
  belongs_to :group
end

class Group < ApplicationRecord
  has_many :artboards_groups, dependent: :destroy
  has_many :artboards, through: :artboards_group
end

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

NoMethodError: private method `y' called for #<Group id: 5, name: nil>

В соответствии с этим thread (более 10 лет назад) это связано с тем, что в ActiveRecord :: Base есть имя частного метода с именем 'y' /lib/ruby/2.5.0/psych/y.rb, котороепроисходит от гема с именем psych , который является парсером yaml

Я не хочу менять имя атрибута для 'y', учитывая, что оно ссылается на систему координат и (x, y)является стандартом для координат. Есть ли другой способ справиться с этим?

1 Ответ

3 голосов
/ 08 ноября 2019
class Group < ApplicationRecord
  undef :y
  has_many :artboards_groups, dependent: :destroy
  has_many :artboards, through: :artboards_group
end
irb(main):001:0> g = Group.new(y: 1, x: 2)
=> #<Group id: nil, x: 2.0, y: 1.0, created_at: nil, updated_at: nil>
irb(main):002:0> g.y
=> 1.0

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* * *1006*.
...