8

異なるフィールドごとにモデル自体を変更する必要なしに、実行時にモデルのカスタムフィールドを定義する機能を提供するRuby onRails用のgem/プラグインはありますか?

Railsで使用できるgemとしてパッケージ化されたRedmineacts_as_customizableプラグインのようなものを探しています。

gem 'gemname'
rails g something
rails db:migrate

class Model < ActiveRecord::Base
  acts_as_something
end

Redmineで使用されるCustomFieldクラスとCustomValueクラスは次のとおりです。

編集:

私の質問は明確ではないので、私の必要性をよりよく説明する簡単なユースケースを追加します。

ユーザーが自分のフォームをデザインし、それらのフォームで送信されたデータを収集できるようにしたいと思います。重要な決定は、これらのカスタム動的レコードの保存方法とアクセス方法の設計です。

ここから、この記事ではさまざまなアイデアで問題に取り組みますが、それらにはすべて欠点があります。このため、問題全体を再考する必要なしに、問題がいくつかの宝石でアプローチされているかどうかを尋ねています。

4

4 に答える 4

5

私はこれを行う宝石を知りませんが、serialize非常にうまく機能し、組み込みです。JSON/YAMLに裏打ちされたNoSQL風のドキュメントストアを取得します。

ユーザーがカスタムフォームを作成できるようにすると、ネストされた配列などを属性に直接渡すことができます。ただし、構造を検証する必要がある場合は、自分で行ってください。

于 2012-04-18T10:22:50.717 に答える
3

レール3.2以降、メソッドを使用できますstore。モデルに以下を含めるだけです。

store :properties, accessors: [:property1, :property2, :property3...]

モデルを変更する必要があるのは1回だけです(propertiesdbテーブルにフィールドを追加するため)。スキーマを変更せずに、後でプロパティを追加できます。

これが機能する方法は、プロパティハッシュをYAMLにシリアル化し、データベースに保存することです。ほとんどの場合に適していますが、後でこれらの値をデータベースクエリで使用する場合は適していません。

于 2012-04-18T08:42:08.690 に答える
3

ActiveRecoand(通常は標準のリレーショナルデータベース)でそれを行うのは、トリッキーで複雑になる可能性があります。http://mongoid.org/docs/documents/dynamic.htmlを見てください-このメカニズムはnosql機能を使用しています。

次のトリックを試すこともできます。

1 /たとえば、データベース列のカスタムフィールドを使用してハッシュをシリアル化します{ :foo => 'bar', :fiz => 'biz' }

2 /データベースからレコードをロードした後、いくつかのメタプログラミングを実行し、レコードのシングルトンクラスで対応するメソッドを定義します(たとえば、カスタムフィールドが列に格納され、シリアル化されていると仮定しcustom_fieldsます)。

after_initialize :define_custom_methods
# ..or other the most convinient callback

def define_custom_methods
  # this trick will open record's singleton class
  singleton_class = (class << self; self; end)
  # iterate through custom values and define dynamic methods
  custom_fields.each_with_key do |key, value|
    singleton_class.send(:define_method, key) do
      value
    end
  end
end
于 2012-04-18T12:35:23.667 に答える
0

gemはわかりませんが、フィールドをデータ型で制限する場合は、名前列と、場合によってはデータ型列を持つcustom_fieldsというテーブルを作成することで実現できます。次に、目的のテーブルと値へのカスタムフィールドの結合テーブルを作成し、必要な検証を行います。

于 2012-04-13T16:51:31.490 に答える