1

私はhttps://gist.github.com/scttnlsn/1295485から始めて、安らかなシナトラ アプリを作成しました。ただし、次のようなパスの HaBTM 関係を管理するのは困難です。

delete '/:objecttype/:objid/:habtm_type/:habtm_id'

マップのおかげで(その要点に従って)既にオブジェクトタイプを取得しており、IDを使用してデータベースから適切なオブジェクトを取得するのは簡単です。ただし、habtm の反対側を取得し、objecttype で適切なメソッドを呼び出して関係を削除するには、少数の文字列を適切なオブジェクトとメソッドに変換する必要があります。

私は解決策を思いつきましたが、それは eval を使用しています。eval を使用することは悪であり、そうすると私の魂が腐敗することを認識しています。これを処理するためのより良い方法はありますか、それともコードを保護し、それを一日と呼ぶためにいくつかの安全策を講じるべきですか?

これは、私が評価をどのように行っているかを示す、動作する自己完結型のシナトラフリーの例です。

require 'mongoid'
require 'pp'

def go
  seed

  frank = Person.find_by(name:"Frank")
  apt = Appointment.find_by(name:"Arbor day")

  pp frank
  really_a_sinatra_route(frank.id, "appointments", apt.id)
  frank.reload
  pp frank
end

def really_a_sinatra_route(id, rel_type,rel_id)
  # I use "model" in the actual app, but hardwired a person here to 
  # make a simpler example

  person  = Person.find_by(id: id)
  person.deassociate(rel_type,rel_id)
end

class Base
  def deassociate(relationship,did)
    objname = associations[relationship].class_name

    # Here's the real question... this scares me as dangerous. Is there 
    # a safer way to do this?
    obj = eval "#{objname}.find(did)"
    eval "#{relationship}.delete(obj)"
  end
end

class Person < Base
  include Mongoid::Document
  has_and_belongs_to_many :appointments

end

class Appointment < Base
  include Mongoid::Document
  has_and_belongs_to_many :persons
end

def seed
  Mongoid.configure do |config|
    config.connect_to("test_habtmexample")
  end
  Mongoid.purge!

  frank=Person.create(name:"Frank")
  joe=Person.create(name:"Joe")
  ccon = Appointment.create(name:"Comicon")
  aday = Appointment.create(name:"Arbor day")

  frank.appointments << ccon
  frank.appointments << aday
  ccon.persons << joe
  joe.reload
end

go
4

1 に答える 1

1

freenode の素敵な紳士が私を助けてくれました。これらの 2 つの eval は、次のように置き換えることができます。

obj= self.send(relationship.to_sym).find(did)
self.send(relationship.to_sym).delete(obj)
于 2013-08-01T20:57:30.413 に答える