Во-первых, я не думаю, что это нарушает закон Деметры как таковой. У вас есть метод для объекта, который вызывает один метод для атрибута для создания временной переменной, а затем воздействует на временную переменную.
Было бы нарушением Закона Деметры, если бы вы делали это из другого класса полностью. например,
class User
def names_of_lands_ive_known
photos.map(:land_uses).map(:name).join ', '
end
end
На самом деле, это просто хорошая информация, скрывающаяся. Но, если вы хотите иметь возможность писать photo.land_uses.names
, вы можете добавить расширение в ассоциацию, чтобы делать то, что вы хотите.
class Photo
has_and_belong_to_many :land_uses do
def names_as_list_string
all.map(:name).join ', '
end
end
end
Для получения дополнительной информации о расширениях ассоциации, ознакомьтесь с docs .
Лучший способ подчиниться закону деметры - это делать более или менее то, что вы делаете, хотя, потому что добавление вашего метода в Photo
означает, что методы, взаимодействующие с Photo
, не Также необходимо знать о классе LandUse
, просто у этой фотографии есть метод, который возвращает строку с именами землепользования.