0

我想獲取張貼誰去了同一所大學作爲當前用戶的這些用戶的所有帖子......所以我歡迎控制器裏面我寫了下面的代碼..如何在控制器內使用行動數組變量


class WelcomesController < ApplicationController 

def index 

    @col = Education.select(:college_id).where(:user_id => @current_user) 
    @user = Education.select(:user_id).where(:college_id => @col) 
    @welcome = Welcome.where(:user_id => @user) 

end 

end 

以下爲歡迎和教育模式我的瑪代碼:

create_table "welcomes", :force => true do |t| 
    t.text  "message" 
    t.integer "user_id" 
end 

create_table "educations", :force => true do |t| 
    t.integer "college_id" 
    t.integer "user_id" 
end 

@col = Education.select(:college_id).where(:user_id => @current_user) .... 此行返回與當前登錄的user.This相關高校IDS是我的控制檯被返回下面的輸出上可以正常使用..

[#<Education college_id: 1>, #<Education college_id: 2>] 

但我不知道如何在我的下一行使用這個輸出,所以我寫了這個聲明,它應該返回所有用戶的大學ID是prevous語句的輸出

@user = Education.select(:user_id).where(:college_id => @col) 

和我的最後一行應該返回發表其ID是@user陣列內的用戶的所有帖子:

@welcome = Welcome.where(:user_id => @user) 

但這不是working.When我跑我的項目,我看不到我的網頁和控制檯上的任何輸出我越來越接着輸出: SELECT welcomes。* FROM welcomes WHERE(welcomesuser_id IN(NULL)) 這意味着它沒有得到任何的用戶ID .. 我怎麼能解決這個...

+0

**使用粗體文本會使事情變得更難以閱讀,並且不知道什麼是重要的,所以請避免使用粗體文本處理長句,而是使用粗體文本強調真正需要強調的內容。 ** – Zabba 2012-04-09 06:33:04

+0

好吧Zabba會照顧你說的... – NJF 2012-04-09 07:31:44

回答

0

你可以試試這個:

@col = Education.select(:college_id).where(:user_id => @current_user.id).all 
@users = Education.select(:user_id).where(:college_id => @col.collect(&:college_id)).all 
@welcome = Welcome.where(:user_id => @users.collect(&:user_id)).all 
+0

Zabba:是的! – okodo 2012-04-09 06:38:42

+0

非常感謝... user1297959 ....我的答案解決了我的查詢... – NJF 2012-04-09 07:16:32

0

我看到完成的最好方法這是爲了在用戶和教育模型之間建立has_many_and_belongs_to_many關係。 (每個教育將有許多用戶,每個用戶可能有多個教育)。您需要在數據庫中創建一個加入表以支持這種類型的關係 - 有關詳細信息,請參見Rails Guide

我會成立自己的模型這種方式:

class User < ActiveRecord::Base 
    has_one :welcome 
    has_and_belongs_to_many :educations 
end 

class Education < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

class Welcome < ActiveRecord::Base 
    belongs_to :user 
end 

連接表的has_many_and_belongs_to_many連接表遷移(一定要仔細檢查這個代碼,不知道我這完全正確):

def self.up 
    create_table 'education_user', :id => false do |t| 
    t.column :education_id, :integer 
    t.column :user_id, :integer 
    end 
end 

控制器代碼現在更簡單,看起來像這樣:

@welcomes = @current_user.eductions.users.welcome.all 

您認爲:

<% @welcomes.each do |welcome| %> 
    <p><%= welcome.message %></p> 
<% end %> 

之一的Ruby on Rails的更強大的功能是模型的關係。他們在前面做了一些工作,但如果你花時間正確地設置它們,他們可以讓你的生活變得更容易,正如上面簡化的@welcomes查詢所證明的那樣。

0

我建議你做用戶和拼貼

class User < ActiveRecord::Base 
    has_many :educations 
    has_many :colleges, :through => :educations 
    has_many :posts 

    scope :by_college_id, lambda {|cid| where("exists (select educations.id from educations where educations.user_id = users.id AND educations.college_id in (?) limit 1)", Array.wrap(cid)) } 

    def college_mates 
    self.class.by_college_id(self.college_ids).where("users.id != ?", id) 
    end :through => :educations 
end 

class Education < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :college 
end 

所以現在的關係在你的控制器,你可以寫

class WelcomesController < ApplicationController 
    def index 
    @posts = @current_user.college_mates.includes(:posts).map(&:posts).flatten 
    # or 
    @posts = Post.where(user_id: @current_user.college_mates.map(&:id)) 
    end 
end 

第二個變體產生3 SQL的請求,第一個變體 - 僅二。但是這與數據一樣,我認爲時間也會一樣。通常控制器只包含幾行代碼,所有的邏輯都寫在模型中。理想情況下,控制器應該只包含Post.by_college_mates_for(@curren_user.id)

相關問題