Heroku的join/includes功能在sqlite开发环境中无法正常工作。

18 浏览
0 Comments

Heroku的join/includes功能在sqlite开发环境中无法正常工作。

以下是我在我的开发(SQLite)环境中完美运行的代码:

key = "%#{keywords}%"
listings = Listing.order(:headline)
listings = listings.includes(:neighborhood).where("headline like ? or neighborhoods.name like ?", key, key) if keywords.present?

但是,在Heroku上尝试类似的代码时,出现了一些错误:

listings = listings.includes(:neighborhood).where("headline like ? or neighborhoods.name like ?", key, key)
ActiveRecord::ConfigurationError: 找不到名为'neighborhoods'的关联;也许拼写错误?

我还尝试了以下代码,并获得了相应的错误:

listings = Listing.includes(:neighborhood).where("headline like :keywords or neighborhood.name like :keywords", :keywords => "%#{keywords}%")
ActiveRecord::StatementInvalid: PG::Error: ERROR:  missing FROM-clause entry for table "neighborhood"
LINE 1: ..._id" WHERE (headline like '%prospect heights%' or neighborho...
                                                             ^

我还尝试了以下代码,并获得了以下错误:

listings = Listing.joins(:neighborhood).where("headline like :keywords or neighborhood.name like :keywords", :keywords => "%#{keywords}%")
ActiveRecord::StatementInvalid: PG::Error: ERROR:  missing FROM-clause entry for table "neighborhood"
LINE 1: ..._id" WHERE (headline like '%prospect heights%' or neighborho...
                                                             ^

想法是什么?

谢谢。

编辑1:

一个列表`belongs_to neighborhood`,而且neighborhood`has_many listings`。

编辑2:

提取了其中一个SQL语句并通过`psql`运行,结果如下:

SELECT "listings".* FROM "listings" INNER JOIN "neighborhoods" ON "neighborhoods"."id" = "listings"."neighborhood_id" WHERE (headline like '%prospect heights%' or neighborhood.name like '%prospect heights%');
ERROR:  missing FROM-clause entry for table "neighborhood"
LINE 1: ..._id" WHERE (headline like '%prospect heights%' or neighborho...

0
0 Comments

问题的原因是代码中的表名不一致。在查询中,使用了"neighborhoods"表,但后面却试图使用"neighborhood"。解决方法是将代码中的表名统一为"neighborhoods"。

在RoR中如何解决这个问题,我不清楚,但也许这个指导方向已经足够了。

我已经尝试过使用neighborhoodsneighborhood,并且产生了不同的错误。实际上,前两个错误是由neighborhoods.name生成的,而后两个错误是由neighborhood.name生成的。

正如我之前要求的那样,请提供实际的查询,格式化后易于阅读,并提供相应的错误信息。一行300个字符以上的查询是无法阅读的。

0
0 Comments

Heroku的join/includes在sqlite开发环境中不起作用的原因是由于SQLite和PostgreSQL之间的不一致性。为了解决这个问题,最好的方法是确保开发和生产环境尽可能地相似,并在本地实际运行PostgreSQL。如果您使用的是Mac系统,Heroku Postgres有一个独立的应用程序可以下载和使用,无需任何配置。这个应用程序可以在http://postgresapp.com/上找到。

感谢您的回答,这正是我在寻找的。通过Homebrew和其他一些步骤来配置PostgreSQL对我的需求来说有点繁琐。

没有问题。这正是这个应用程序的设计初衷 🙂

0
0 Comments

问题的原因是在Heroku上的join/includes方法无法像在sqlite开发环境中那样工作。解决方法是使用ILIKE替代LIKE,并确保使用正确的表名。

在尝试解决问题的过程中,用户首先尝试了以下代码:

listings = Listing.includes(:neighborhood).where("listings.headline like :keywords or neighborhoods.name like :keywords", :keywords => "%#{keywords}%")

然后,用户意识到应该调用`listings.headline`而不是`headline`:

SELECT "listings".* FROM "listings" INNER JOIN "neighborhoods"   
ON "neighborhoods"."id" = "listings"."neighborhood_id"  
WHERE (
headline like '%prospect heights%'               #I mean here
or neighborhood.name like '%prospect heights%')  #also here, should be neighborhoods.name 

然后用户尝试使用ILIKE替代LIKE:

listings = Listing.includes(:neighborhood).where("listings.headline ilike :keywords or neighborhoods.name ilike :keywords", :keywords => "%#{keywords}%")

但是仍然出现了之前的错误。

用户询问了SQLite和PGSQL之间的区别,并且意识到模型名称是`neighborhood`,而表名是`neighborhoods`。用户还发现ILIKE在SQLite中不起作用。建议用户在本地安装postgreSQL以解决兼容性问题。用户问道,在OSX上本地安装postgreSQL是否容易,是否像安装ImageMagick那样简单。

最后,用户表示在安装过程中遇到了一些问题,但通过homebrew安装是最简单的方法。

0