だから、私はこの昨晩働いていると思って、それを誓った。今はうまくいきません。私は時間を割いて助けを求めます。ruby on rails method_missingの問題を使ってDBの動的属性フィールド
、データベース内の動的なフィールドを定義イム、半EAVスタイル、と私はEAVが
とにかくイムはそれを少しやって:)良いアイデアであるかどうかについて、あなたの意見を聞くように注意してはいけない、今だけを述べることができます過去に行われたのとは違って、基本的に属性(またはフィールド)が追加されたときに、特定の属性テーブルへの追加列を作成して実行します(または削除します)。いずれにしても、すべての属性が定義されている直接の関係である真ん中に座って、属性がカテゴリ固有であるため、実際の属性名を列名として使用することはできません。
それはあなたが
Entity
belongs_to :category
Category
has_many :entities
EntityAttribute
belongs_to :category
EntityAttributeValue
belongs_to :entity_attribute
belongs_to :entity
そしてEAVテーブルを視覚化することができます場合は、新しい属性が作成されるように、その特定のエンティティのための値が含まれていattribute_2 ATTRIBUTE_1ラベルの列と、水平に広がっています。とにかく
- 私はエンティティモデルのメソッドを動的にしようとしていますので、私はここでentity.actual_attribute_name @、というよりもentity.entity_attribute_value.field_5
@呼び出すことができ、私が働いていたと思ったコードがあります - -
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
私は戻ってコードに行ってきましたように私は、レコードを保存したときに、今日、私はレールコンソールで属性を設定することができ、それが正しいフィールドを返すだろうが、私が実現し、EntityAttributeValueが更新されていませんでした(上記のself.project_category_field_valueで表されます)
これをさらに調べてみると、before_updateまたはbefore_saveコールバックを手動で属性を保存するために追加しなければならないように見えました。コールバックでは、オブジェクトがあるかのように、コールバックでmethod_missingコールバックを再実行します。複製されている(そして、新しいオブジェクトは元のオブジェクトのコピー)、または何か、私はかなり確かではありません。しかし、セーブポイントやセーブポイントでは、私の属性は忘却に消えてしまいます。
私はそれを入力した後、私自身の質問に半分答えたと思います。インスタンス変数を設定し、method_missingメソッドの最初に存在するかどうかを確認する必要があります。起こっていることは分かりませんが、私がやろうとしていることをやるより良い方法があるかどうかを質問しています。
method_missingを使用していないと悪い考えがある場合は、方法の欠如に関する記事を読むと、なぜ人々がそれを叩いたと聞いたのですが、その人の誰かが、方法の欠如が悪い解決策。
ありがとうございます。
レスポンスのおかげで、私はそれが上記のコードを経由して一人で作業を取得することができませんでしたが、私は答えとして共有するための – thrice801