0

SQLでは次のことができますSELECT x,y FROM ...

しかし、私がを使用する場合where、生成されたSQLは、それが作用しているモデルからのみ選択します。

したがって、たとえば:

user has_many :posts
post belongs_to :user

Post.includes(:users).where('created_at < ?' 1.day.ago)があります

SELECT "posts".* FROM "posts" WHERE (created_at > '2013-03-06 07:37:09.010916')

しかし、投稿とユーザーをどのようにすればSELECT、投稿ユーザーも返されるようになりますか?

4

2 に答える 2

1

更新:Saurabhが指摘したように、ロードされる関連付けは:usersではなく:userである必要があります

インクルードは、関連レコードを熱心にロードするために使用されます。つまり、次のようになります。

@posts = Post.includes(:user)
@posts.each do |post|
  post.user
end

データベースに対して行われるクエリは2つだけです。1つは投稿をフェッチするためのもので、もう1つはに関連付けられているすべてのユーザーをフェッチするためのもの@postsです。Railsが関連付けを管理します。単純。

別のテーブルから特定の列の値を取得する場合は、次のことを試してください

@posts = Post.joins(:user).select('posts.*, users.name AS user_name')
@posts.first.user_name # will give you the name of the first user associated to the post
于 2013-03-07T08:00:03.347 に答える
0

まず、関連付けが間違っています。あなたが言うとき、あなたはできませんPost.includes(:users): post belongs_to :user.

正しい方法は -

Post.includes(:user)belongs_to アソシエーション用。

次に、次のようにして、別のテーブルから値を選択できます。

Post.includes(:user).where(:user => {:name => params[:name]})

上記のクエリは、ユーザー名がuser テーブルのフィールドparams[:name]であるすべての投稿を取得します。:name

于 2013-03-07T09:00:09.413 に答える