2013-05-02 33 views
7

Trong ứng dụng Rails, tôi chỉ yêu cầu người dùng nhập email và tên khi đăng ký, nhưng sau đó cung cấp cho họ tùy chọn cung cấp chi tiết liên hệ đầy đủ hơn cho tiểu sử của họ. Vì vậy, tôi có một mô hình User.rb có một hiệp hội với Contact.rb, cụ thể là,cách tham gia bảng được liên kết với liên kết has_one

User.rb

has_one :contact 

Contact.rb

belongs_to :user 

Contact.rb có thể dự đoán được các trường bạn có thể mong đợi, chẳng hạn như địa chỉ, mã bưu chính, v.v. nhưng nó cũng lưu giữ province_id cho mối quan hệ với mô hình Province.rb, do đó,

Liên hệ.rb

attr_accessible :address, :city, :mobile, :postalcode, :province_id, :user_id 
belongs_to :user 
belongs_to :province 

Province.rb

has_many :contacts 

tôi đã làm nó theo cách đó (chứ không phải lưu trữ tên của tỉnh như là một "chuỗi" trên contact.rb) để tôi có thể dễ dàng hơn (vì vậy tôi nghĩ) phân loại người dùng theo tỉnh.

Trong chương trình hành động của một trong những artists_controller, tôi làm như sau để kiểm tra xem người dùng đang cố gắng để sắp xếp theo tỉnh và sau đó gọi một phương pháp artists_by_province mà không tìm kiếm

if params[:province_id] 
    province = params[:province_id] 
    province = province.to_i #convert string to integer 

    @artistsbyprovince = User.artists_by_province(province) 

    else 

    @artists = User.where(:sculptor => true) 

    end 

Đây là phương pháp trên mô hình User.rb mà nó gọi nếu một id tỉnh được thông qua tại

scope :artists_by_province, lambda {|province| 
    joins(:contact). 
    where(contact: {province_id: province}, 
     users: {sculptor: true}) 

    } 

Tuy nhiên nó mang lại cho tôi lỗi này:

Could not find table 'contact' 

Nếu tôi làm cho danh bạ số nhiều

scope :artists_by_province, lambda {|province| 
    joins(:contacts). 
    where(contacts: {province_id: province}, 
     users: {sculptor: true}) 

    } 

Lỗi này

Association named 'contacts' was not found; perhaps you misspelled it? 

bất cứ ai có thể cho tôi biết những gì tôi đang làm sai khi tôi đang làm cho truy vấn này?

Cập nhật: Tôi đã thay đổi một số chi tiết sau khi công bố vì sao chép và dán của tôi đã có một số vấn đề với nó

T.B. bỏ qua thực tế là tôi đang tìm kiếm một 'nhà điêu khắc'. Tôi đã thay đổi tên của các loại người dùng cho câu hỏi.

từ schema.rb

create_table "contacts", :force => true do |t| 
    t.string "firm" 
    t.string "address" 
    t.string "city" 
    t.string "postalcode" 
    t.string "mobile" 
    t.string "office" 
    t.integer "user_id" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    t.integer "province_id" 
    end 

Trả lời

0

Bạn có thể thử những điều sau đây?

scope :artists_by_province, lambda {|province| 
    joins(contact: {province: { id: province}}). 
    where(sculptor: true) 
} 
+0

đó đã cho tôi lỗi này: Hiệp hội có tên là 'province_id' không được tìm thấy; có lẽ bạn đã viết sai chính tả nó? – Leahcim

+0

Xin vui lòng, xem bài viết cập nhật của tôi –

+0

Tôi không có kinh nghiệm với điều này. Giải pháp của bạn có tốt hơn tôi không? Nếu có, bạn có thể giải thích tại sao không? Cảm ơn. – Leahcim

7

Vấn đề đã được cố định bằng cách sử dụng contact (số ít) trong tham gia và contacts (số nhiều) trong mệnh đề where. Tôi đoán 'liên hệ' (số ít) phản ánh liên kết has_one giữa User.rb và Contact.rb, trong khi 'liên hệ' được sử dụng trong mệnh đề where để đại diện cho tên của bảng, luôn luôn là số nhiều.

User.rb

has_one :contact 

    scope :artists_by_province, lambda {|province| 
    joins(:contact). 
    where(contacts: {province_id: province}, 
     users: {sculptor: true}) 

    } 
+0

Vâng, đó là điều tôi cũng hiểu. Bằng cách này, bài viết của tôi là không sử dụng cho bạn vì nó sẽ tạo điều kiện province_id trên mệnh đề join bên trái dẫn đến tất cả người dùng với sculptor = true. –

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