だから、私はこれが昨夜うまくいったと思っていた、それを誓うことができた. 今はうまくいかないので、そろそろ助けを求める時が来たと思います。
私はデータベースで動的フィールドを半 EAV スタイルで定義していますが、EAV が良いアイデアかどうかについてあなたの意見を聞く気にはなりません:)
基本的に、属性 (またはフィールド) が追加されると、特定の属性テーブルの移行に列を追加して実行します (または削除します)。すべての属性が定義されている直接的な関係であるカテゴリレイヤーが真ん中にあるため、属性はカテゴリ固有であるため、実際の属性名を列名として使用することはできません。
それで、それがあなたが視覚化するのに役立つなら
Entity
belongs_to :category
Category
has_many :entities
EntityAttribute
belongs_to :category
EntityAttributeValue
belongs_to :entity_attribute
belongs_to :entity
また、新しい属性が作成されると、EAV テーブルは水平方向に広がり、attribute_1 attribute_2 というラベルの付いた列があり、その特定のエンティティの値が含まれます。
とにかく - 私はエンティティモデルでメソッドを動的にしようとしているので、@entity.entity_attribute_value.field_5ではなく@entity.actual_attribute_nameを呼び出すことができます
ここに私が働いていると思ったコードがあります -
def method_missing(method, *args)
return if self.project_category.blank?
puts "Sorry, I don't have #{method}, let me try to find a dynamic one."
puts "let me try to find a dynamic one"
keys = self.project_category.dynamic_fields.collect {|o| o.name.to_sym }
if keys.include?(method)
field = self.project_category.dynamic_fields.select { |field| field.name.to_sym == method.to_sym && field.project_category.id == self.project_category.id }.first
fields = self.project_category.dynamic_field_values.select {|field| field.name.to_sym == method }
self.project_category_field_value.send("field_#{field.id}".to_sym, *args)
end
end
その後、今日コードに戻ると、Rails コンソールで属性を設定できたにもかかわらず、正しいフィールドが返されることに気付きました。レコードを保存したときに、EntityAttributeValue が更新されていませんでした (上で self.project_category_field_value として表されています)。 )
さらに詳しく調べたところ、属性を手動で保存するために before_update または before_save コールバックを追加する必要があるように見えました。コールバックで、オブジェクトが複製されているかのように、method_missing コールバックが再実行されることに気づきました。 (そして新しいオブジェクトは元のオブジェクトのコピーでした)、または何か、よくわかりません。しかし、保存プロセス中またはその前のある時点で、私の属性は忘却の中に消えます。
だから、入力した後、自分の質問に途中で答えたと思います。インスタンス変数を設定し、method_missing メソッドの最初に存在するかどうかを確認する必要があります (右?) 多分それは何が起こっているのかわかりません、しかし、私がやろうとしていることを行うためのより良い方法があるかどうかも尋ねています.
また、method_missing の使用が悪い考えである場合は、その理由を説明してください。メソッドの欠落に関する投稿を調べていると、何人かの人々がそれを非難していると聞きましたが、メソッドの欠落が悪い解決策である理由について合理的な説明を提供する人は誰もいませんでした.
前もって感謝します。