2011-10-18 3 views
1

私はアプリでMongoDBを使用していますが、私のドキュメントのフィールドは大きくなりましたが、私の見解では、各属性に対してブロックifを持っている必要はないと思っています。属性が存在する場合はそれ以外の場合は何もしません。Ruby、MongoDB、未定義のメソッドについて不平を言うことはありませんか?


例:

モンゴは、これらの値は私のモデルの以前のインスタンスで定義されないであろう、スキーマレスなので。

<%= @company.address %> 
<%= @company.longitude %> 
<%= @company.latitude %> 

これはどのように処理しますか?

+0

MongoDB Ruby Driverまたは任意のORMを使用していますか? –

+0

ちょっとジョナス、私はモンゴイドを使用しています –

答えて

1

、あなたは常にだけで通話を食べると返し、そのクラスで独自のmethod_missingを実装することができnil:これは、カーペットの下に多くの問題を掃引でき

class Company 
    def method_missing(*args) 
    nil 
    end 
end 

だから、この種のことをするときは慎重にしたいと思うでしょう。

また、あなたがこれを行うことができます拡張子を作ることができる:

= @company.try_method(:address) 

address方法が存在しない場合は、初期化子でこれを追加する場合、これはnilを返します。

class Object 
    def try_method(method, *args) 
    respond_to?(method) ? send(method, *args) : nil 
    end 
end 

tryメソッドがnilを返す可能性があるが、メソッドが定義されていない場合にのみ、Railsの一部であるメソッドが機能します。

+0

私は、これらすべての文書ベースのORMのすべてが主にスキーマレスであることを考えれば、ますます多くの人々が抱えているこの問題ではないと思いますか?途中で大きな答え。 –

+0

私はあまり使っていませんが、JavaScriptメソッドスタイルの代わりに '[]'アクセサを使ってハッシュを使うようになっているはずです。 JavaScriptでは、 'object.arbitrary'はデフォルトでは安全に' null'ですが、Rubyでは未定義のメソッド呼び出しです。 – tadman

1

モンゴイド支持体field default values。あなたはそれだけで対処したい場合は

class Company 
    include Mongoid::Document 
    field :address, type: String, default: "" 
end 
+0

文字列に安全に変換できる限り、ビューはあなたが与えるものに気を付けません。 '<%= (expr) %>'の結果は常に '(expr).to_s'であり、' nil.to_s'が空の文字列を返すのに便利です。 – tadman

+0

それを考えると、彼は全く役に立たなかった。彼は何も役立たなかったし、もし望むなら、存在しない属性を提供した。 –

関連する問題