2015-04-04 31 views
0

我的模型:布爾字段表明記錄與給定的字段值屬於關聯

class CountryVisit < ActiveRecord::Base 
    belongs_to :country 
    belongs_to :user 

    validates :country, uniqueness: { scope: user, message: 'already visited' } 
end 

class User < ActiveRecord::Base 
    has_many :country_visits 

    ... 
end 

class Country < ActiveRecord::Base 
    has_many :country_visits 

    ... 
end 

我想每個國家有一個虛擬屬性表明它具有country_visit給定用戶

Country.for(user)

這是我的不完整的解決方案(提高ActiveRecord::StatementInvalid: SQLite3::SQLException如果我試圖執行.count的結果):

def self.for(user_id) 
    Country 
    .select("countries.*, country_visits.id AS visited") 
    .joins(
     "LEFT OUTER JOIN country_visits ON 
     country_visits.country_id = countries.code 
     AND country_visits.user_id = #{user_id}" 
    ) 
end 

預期的行爲:

user = User.create 

#with country visit 
c1 = Country.create 
cv1 = CountryVisit.create(country: c1, user: user) 

#without country visit 
c2 = Country.create 

結果應該是:

countries = Country.for(user_id).order('created_at asc') 
countries.first.visited # => true 
countries.last.visited # => false 
+0

我不明白,結果你想從這個查詢得到什麼? – Fenec 2015-04-04 14:36:28

+0

@ Fenec我的不好。更新了**預期行爲的問題** – 2015-04-04 14:45:51

回答

0

很簡單這裏實際上問題。如果你看一下完整的錯誤:

ActiveRecord::StatementInvalid: SQLite3::SQLException: unrecognized token: 
"#": SELECT countries.*, country_visits.id AS visited FROM "countries" LEFT 
OUTER JOIN country_visits ON country_visits.country_id = countries.id AND 
country_visits.user_id = #<User:0x007fcb357a5ed8> ORDER BY created_at asc 

通知#<User:0x007fcb357a5ed8>上面出現?這是因爲在for方法你傳遞完整的用戶對象,而不是用戶ID。而且因爲你在寫原始SQL,活動記錄是不夠聰明要挾AR對象爲ID。解決這個問題

最簡單的方法就是改變你的國家的方法是:

def self.for(user) # <-- user 
    Country 
    .select("countries.*, country_visits.id AS visited") 
    .joins(
     "LEFT OUTER JOIN country_visits ON 
     country_visits.country_id = countries.code 
     AND country_visits.user_id = #{user.id}" # <-- user.id 
    ) 
end 
+0

對不起。這是例如 – 2015-04-04 15:08:31

+0

是由打字錯誤這是不以任何方式解決的,應予刪除 – 2015-04-04 15:13:33

+0

@IvanDenisov然後改變你的問題,因爲現在它是爲你所描述什麼工作的唯一的事。 ;) – 2015-04-04 16:11:22