1

私は小さな問題に遭遇しました私はここに関係を通してhas_manyを持っていますモデルのコードです

class User < ActiveRecord::Base
  has_many :friendships
  has_many :followings, :through => :friendships, :foreign_key => "followed_id"
end

class Friendship < ActiveRecord::Base
  belongs_to :user 
  belongs_to :following, :class_name => "User", :foreign_key => "followed_id"
end

これで、コンソールでu = User.firstと入力し、次にu.friendships.first.followingと入力すると、uがフォローしている最初のユーザーが表示されますが、u.friendships.last.followingと入力すると、このエラーが発生します。

u.friendships.first.followingからのSELECTステートメント

Friendship Load (0.3ms)  SELECT `friendships`.* FROM `friendships` WHERE `friendships`.`user_id` = 208 LIMIT 1
User Load (0.2ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 209 LIMIT 1

およびu.friendships.last.followingからのSELECTステートメント

Friendship Load (0.3ms)  SELECT `friendships`.* FROM `friendships` WHERE `friendships`.`user_id` = 208 ORDER BY `friendships`.`` DESC LIMIT 1
ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'friendships.' in 'order
clause': SELECT  `friendships`.* FROM `friendships`  WHERE `friendships`.`user_id` = 208
ORDER BY `friendships`.`` DESC LIMIT 1

その後、u.friendshipsを実行してからu.friendships.last.followingを再度実行すると、エラーは発生しなくなります。これはなぜですか。

4

1 に答える 1

1

Rails 3.2.9 / postgresqlfriendshipsのコードから直接、 の sql 出力を次に示します。

# u.friendships.first.following
Friendship Load (0.9ms)  SELECT "friendships".* FROM "friendships" WHERE "friendships"."user_id" = 1 LIMIT 1

# u.friendships.first.following
Friendship Load (1.3ms)  SELECT "friendships".* FROM "friendships" WHERE "friendships"."user_id" = 1 ORDER BY "friendships"."id" DESC LIMIT 1

そのため、何らかの理由でid自動的にピックアップされ、機能しORDER BY "friendships"."id"ます。おそらくあなたの問題はあなたのDBと関係がありますか?

#Statements used to create the db for reproducing this problem
CREATE TABLE users (id SERIAL PRIMARY KEY)
CREATE TABLE friendships (
    id            SERIAL PRIMARY KEY,
    user_id       integer
    followed_id   integer 
);
于 2012-12-09T20:01:49.793 に答える