我有一个find_by_sql语句,我试图将位置ID传递给。我以为我可以这样做:
def self.location_history()
Location.find_by_sql("select * from locations a INNER JOIN hotspots b ON a.id = b.location_id INNER JOIN accounts c ON b.mac = c.account_id WHERE a.location_id= '#{id}'")
end
我认为以下内容会从网址中提取id参数:
a.location_id = '#{id}'
然而,这会引发有关未定义变量的错误。
我可以看到id => '2'参数随请求一起发送,但我不知道如何从模型中调用。如果可能的话?
答案 0 :(得分:4)
您无法从Rails模型访问“params”哈希。参数仅供您的控制器和视图进行交互。
您可以将控制器所需的值传递给模型,而不是:
def self.location_history(location_id)
Location.find_by_sql("select * from locations a INNER JOIN hotspots b ON a.id = b.location_id INNER JOIN accounts c ON b.mac = c.account_id WHERE a.location_id= '#{location_id}'")
end
并在控制器中:
def index
@location_history = Location.location_history(params[:id])
end
或者更好的是,在Rails 3中这样的东西更清晰。此外,这将从SQL注入中转义location_id参数。
def self.location_history(location_id)
joins(:hotspots, :accounts).where(:location_id => location_id)
end
您最初不需要“位置”,因为这是当前模型。如果您的关联正确,您可以使用“连接”范围链接这些表,并将您需要的参数传递给“where”,