Что TedTran2019
сказал.
Не зная ничего о вашем домене, я бы испытал соблазн иметь модель PostMetric
что-то вроде:
# == Schema Information
#
# Table name: post_metrics
#
# id :bigint not null, primary key
# post_id :integer not null
# metric_id :ingeger not null
# value :string not null
# created_at :datetime not null
# updated_at :datetime not null
#
class PostMetric < ApplicationRecord
belongs_to :post
belongs_to :metric
end
... иPost
модель что-то вроде:
class Post < ApplicationRecord
belongs_to :site
has_many :post_metrics, dependent: :destroy
has_many :metrics, through: :post_metrics
Metric.all.pluck(:name).each do |metric_name|
define_method("#{metric_name}_metric") do
metrics.where(name: metric_name)
end
define_method("post_#{metric_name}_metric") do
post_metrics.where(metric: send("#{metric_name}_metric"))
end
end
end
... и модель Metric
что-то вроде:
# == Schema Information
#
# Table name: metrics
#
# id :bigint not null, primary key
# name :string not null
# created_at :datetime not null
# updated_at :datetime not null
#
class Metric < ApplicationRecord
has_many :post_metrics
has_many :posts, through: :post_metrics
end
Естественно, вам нужно будет seed
(или иным образом создать) каждая из ваших Metric
записей.
Таким образом, ваша Post
отвечает на metrics
, а Metric
- не сверхъестественное имя модели.
Кроме того, выВы сможете сделать что-то вроде @post.view_metric
и @post.post_view_metric
(для извлечения модели соединения, если это будет полезно).
Когда вы удаляете запись Post
, она уничтожит все связанные с нейPostMetric
присоединяйтесь к моделям, но оставьте свои Metric
модели без изменений.