Rails 能否调用另一个网站项目中的 ActiveRecord 功能?

jeky · 2013年04月13日 · 最后由 chucai 回复于 2013年04月14日 · 3165 次阅读

目前有一个 www 站点,已经在线上运行。 我现在想做一个 mobile 手机版本,是一个独立的项目。

但是,我遇到了一个问题: 在 mobile 版本中如何调用 www 版本中的 ActiveRecord 功能?

我现在没有一点头绪,求思路?谢谢各位。

把那个项目的 model 拷过来,连到那个数据库上

可以采用 git submodule 的办法,楼主这样问题在我们公司的项目里经常存在,submodule 是最初期的方案,当然它也有一定缺陷,比如难以管理,而且容易变得臃肿,但是初期依然是首选哦

大家还记得 ActiveResource 这个东西么?最初就是设计用来做这件事情的,但是后来因为很多原因包括安全的考虑,压根没有在社区流行起来,在下一个版本的 Rails 中将被移除。

通常两个网站之间互相调用,通常采用两种方法,通过开放基于 RESTFul API 或者通过消息队列,各有利弊,但都是靠谱的方式,楼主可以自己权衡。

楼主的移动应用是 Native 还是 Web?Native 是用 Ruby 吗?不是的话就和 ActiveRecord 没啥关系了。

我觉得应该调整架构,有一个底层的 API 应用,mobile 和 PC 版的网页都是基于这个应用的,这样的好处是如果将来要做 APP 的话就很轻松了

@Rei :是 WEB 项目,非 Native 方式。 @lgn21st @edokeh @xmonkeycn :从长远来看,封装成 api 倒是挺合适的。不过我接触 ruby 时间不久,目前这个网站也只是拿来练手的,所以我想用比较低的成本,先实现这个功能。后期水平提高了,再慢慢优化。

感谢各位朋友的建议!我刚才测试了一下 @diudiutang 的方案,的确是可行的。比较适合我现在的这种情况,成本不大,只需要配置一个数据库连接,然后将 model 复制进去即可。

ActiveRecord::Base.establish_connection(
    :adapter => "mysql2",
    :host => "localhost",
    :database => "dousile_development",
    :username => "root",
    :password => ""
)

#8 楼 @jeky 这个方案不是非常好,万一需求有改动,你需要兼顾到两边的改动,其次,两个项目共用一个数据库容易导致脏数据,比如一个项目上有一个 before_create after_create 什么的,另一个没有,很快你的数据库就乱套了。除非你能保证两边代码一模一样,或者保证数据的读写都是很简单的。

比较好的方案是将要复用的 model 抽到一个 engine gem 里,同时相应的 migration 也放在这个 gem 中。

#10 楼 @ashchan 的解决方案正是我公司的做法 还加上 submodule

试过 submodule,然后觉得太折腾了,然后就直接文件硬链接了

可以考虑做成一个项目,mount 多个 app(web app,api app,admin app...),共用 model,可以参考一下 padrino

@iBachue @chucai @miclle :我是个新手,说实话我还不太了解 submodule,搜索了一下才知道是 git 中的功能,改天我深入研究一下 submodule。对 git 了解的不是很多,仅会用基本的几个命令,在工作中我们一般是用 svn 比较多些 -_-!

#14 楼 @jeky svn 里也有类似 submodule 的功能

#7 楼 @edokeh 现在很多时候真的需要同时支持 pc 版本和 mobile 版本,pc 原来直接取数据库,如果也和 mobile 一样走 api,经过网络传递获取数据,再经过网络传递到客户端,这样速度和性能上会不会有影响?(没测过,最近正想着这个问题呢)

#16 楼 @as181920 性能上肯定会慢一点的,但是一般应该在可接受的范围内,因为物理上你肯定会把这两个应用放在局域网内 我们公司有一个 JAVA 的项目现在就是这么拆分的,据他们说还不错

Svn 也有 还是代码共享好

需要 登录 后方可回复, 如果你还没有账号请 注册新账号