2016-01-19 3 views
0

В рубине на рельсах, я использовал леску в два раза, как этотfind_by_sql в Rails для пользовательских проверок

rails g scaffold userpost user_field1:string user_field2:string 
rails g scaffold adminpost admin_field1:string admin_field2:string 

Я хочу сделать пользовательскую проверку Когда пользователи публикуют userpost.

Пользователи могут публиковать только пользовательский адрес. Admin может публиковать только adminpost. И пользователь может публиковать user_field1 так же, как admin_field1 и user_field2, как и admin_field2.

Я попробовал этот код

class Userpost < ActiveRecord::Base 
    validates :check_userpost 

    def check_userpost 
    admin_field2 = Adminpost.find_by_sql ("SELECT admin_field2 FROM adminposts WHERE admin_field1 = '#{self.user_field1}'") 
    if admin_field2 != '#{self.user_field2}' 
     errors.add(:user_field2, "not match") 
    end 
    end 
end 

Если у вас есть какие-либо идеи, пожалуйста, дайте мне советует.

+0

Параметр '# {переменная}' синтаксис применяется только на ' "двойные кавычки"' 'не 'одного quotes'' , Может быть, стоит отметить. – javanut13

+0

Я попытался это также определение функции check_userpost admin_field2 = Adminpost.find_by_sql ("SELECT admin_field2 FROM adminposts WHERE admin_field1 = # {self.user_field1}") если admin_field2! = "# {} Self.user_field2" errors.add (: user_field2, "not match") end end' не работает – Mitsunobuk

ответ

0

Ссылка: How do I validate that two values do not equal each other in a Rails model?

наблюдаемых отличий:

  1. "Validate" не "подтверждает"
  2. зачем использовать SQL, когда вы можете использовать ActiveRecord?

    class Userpost < ActiveRecord::Base 
        validate :check_userpost 
    
        def check_userpost 
        tmp = Adminpost.find_by_admin_field1(self.user_field1) 
        if tmp and tmp.admin_field2 != self.user_field2 
         errors.add(:user_field2, "not match") 
        end 
        end 
    end 
    

Принимая дикий удар, делая некоторые погуглите ....

+0

@ Мицунобук вам, вероятно, следует взглянуть на ассоциации моделей, хотя ... проверка должна быть возможна через self.adminpost, поскольку в таблице уже есть некоторая ассоциация: http://guides.rubyonrails.org/association_basics.html – Mingsheng

+0

Очень приятно советовать. Я сделал то, что хочу. Огромное спасибо. – Mitsunobuk

0

Надеясь, что между userpost и adminpost нет отношения.

def check_userpost 
    af1 = Adminpost.where(admin_field1: self.user_field1).first 
    af2 = Adminpost.where(admin_field2: self.user_field2).first 
    if !af1.nil? && af1.admin_field2 != self.user_feild2 
    errors.add(:user_field2, "not match")   
    end 
    if !af2.nil? && af2.admin_field1 != self.user_feild1 
    errors.add(:user_field1, "not match")   
    end 
end 
+0

Thx ваш комментарий. Я решил это. Я рад, что вы комментируете. – Mitsunobuk

Смежные вопросы