私は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