2010-02-19 16 views
6

tôi là tạo ra một mạng xã hội trong Rails và tôi có một mô hình như thế này:Hai cột phải không bằng nhau trong Rails

create_table "friendships", :force => true do |t| 
    t.integer "user1_id" 
    t.integer "user2_id" 
    t.boolean "hasaccepted" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

Vấn đề là bạn không thể thêm cho mình như một người bạn, vì vậy tôi cố gắng này trong mô hình của tôi:

def validate 
    if :user1_id == :user2_id 
     record.errors.add "You cannot add yourself as a friend." 
     return false 
    end 
end 

Và tôi có điều này trong bộ điều khiển của tôi:

def addfriend 
    if params[:id] 
     @friendship = Friendship.new() 
     @friendship.user1_id = session[:user] 
     @friendship.user2_id = params[:id] 
     respond_to do |format| 
      if @friendship.save 
       format.html { redirect_to "/" } # Yes, SO users, I will fix this redirect later and it is not important for now. 
       format.xml { render :xml => @friendship, :status => :created } 
      else 
       format.html { redirect_to "/" } 
       format.xml { render :xml => @friendship.errors, :status => :unprocessable_entity } 
      end 
     end 
    end 
end 

(nơi session[:user] là uid của người dùng hiện đã đăng nhập)

Tuy nhiên, khi tôi truy cập http://localhost:3000/profile/addfriend/2.xml trong khi tôi đăng nhập với tư cách người dùng 2, Rails trả lại cho tôi Friendship mới, thay vì thông báo lỗi và khi tôi thực hiện nhìn vào cơ sở dữ liệu của tôi, các Friendship cũng có (và nó không nên). Ai đó có thể vui lòng giải thích cho tôi cách khắc phục điều này không? Cảm ơn

+0

FYI trong việc di chuyển, bạn có thể chỉ cần sử dụng t.timestamps thay vì t.datetime "created_at" và t.datetime "updated_at". –

+0

@Beerlington: Tôi vừa sao chép một phần của db/schema.rb –

Trả lời

13

Hãy thử nó như thế này:

class Friendship < ActiveRecord::Base 
    validate :cannot_add_self 

    private 

    def cannot_add_self 
    errors.add(:user2_id, 'You cannot add yourself as a friend.') if user1_id == user2_id 
    end 
end 
+0

√ để sửa toàn bộ vấn đề –

+3

Đối với thanh ray 3 cần sử dụng erros [: base] << "Error msg" vì add_to_base đã bị xóa khỏi Rails3. Xem http://stackoverflow.com/questions/10284286/undefined-method-add-to-base –

4
if :user1_id == :user2_id 

Điều đó sẽ luôn sai - bạn đang so sánh các biểu tượng. Nó giống như viết if "user1_id" == "user2_id".

Bạn nên viết nó là if user1_id == user2_id để so sánh giá trị của các cột.

+0

+1 để được giải thích –

Các vấn đề liên quan