Ruby数组基于连接表外键进行验证

时间:2014-08-11 12:44:34

标签: ruby-on-rails ruby

我有一个看起来像这样的数据模型;

class Tran < ActiveRecord::Base

belongs_to :buyer
validates :buyer_id, presence: true

belongs_to :seller
validates :seller_id, presence: true

end

class Seller < ActiveRecord::Base

has_many :trans
has_many :buyers, through: :trans
validates :seller_id, presence: true

end

class Buyer < ActiveRecord::Base

has_many :trans, :foreign_key => "buyer_id"
has_many :sellers, through: :trans
validates :buyer_id, presence: true

end

然后在每个卖家页面上,我都有以下代码,我可以成功列出卖家的最高买家名单,根据他们的总支出下降。

<ol>
  <% @seller.buyers.uniq{|t| t.buyer_id }.sort_by {|su| su.trans.sum(:sum)}.reverse.each do |su| %>
  <li><%= su.name %> <%= su.trans.sum(:sum) %></li>
  <% end %>
</ol> 

此代码的作用是,它仅验证从卖方购买产品的买方,但它目前不验证卖方提供的Trans(例如,在所有卖方之间提取数据)。

我已尝试围绕seller.id进行第二次验证,但不确定如何进行验证。

有没有人有解决方案?

基本上,列表需要在Tran上验证,sell_id既由卖方拥有,又存在于Trans join表中,并且它也引入buyer_id,但只包含supplier_id和buyer_id的交易在场。

2 个答案:

答案 0 :(得分:0)

删除不需要的代码......只有纯has many through association ...它应该是

class Buyer< ActiveRecord::Base 
  has_many :trans
  has_many :sellers, through: :trans
  validates_presence_of :sellers
  ##or you can use blocks also such as below for validation(not null)
  has_many :sellers,through :trans,:reject_if => proc { |a| a['name'].blank? }


end 

 class Tran< ActiveRecord::Base 
  belongs_to :buyers
  belongs_to :sellers

 end


 class Seller< ActiveRecord::Base
   has_many :trans 
   has_many :buyers, through: :trans
   validates_presence_of :buyers

 end

###to get all sellers of a buyer
@buyer.sellers
##to get all buyers from a seller
@seller.buyers

要使这项工作......你需要有三个迁移文件,包括只有两个column-buyer_id和seller_id的trans表,这将阻止买家/卖家之间的连接回退,因此你不需要验证buyer_id / seller_id < / p>

class CreateBuyersSellersTrans < ActiveRecord::Migration
   def change     
    create_table :buyers do |t|
      ##ensures uniqueness
       t.string :name, unique: true 
       t.timestamps
    end 

    create_table :sellers do |t|
     ##ensures uniqueness
       t.string :name, unique: true 
       t.timestamps
     end  

    create_table :trans do |t|
       t.belongs_to :buyer 
       t.belongs_to :seller           t.timestamps 
    end  
  end
end 
控制器中的

 #get all uniq buyers of a seller in array format removing empty even if exits
@sellers=@seller.buyers.flatten.compact.uniq.delete_if(&:blank?)
在您的视图中

<ol>
  <% @sellers.sort_by {|su| su.trans.sum(:sum)}.reverse.each do |su| %>
  <li><%= su.name %> <%= su.trans.sum(:sum) %></li>
  <% end %>
</ol>

答案 1 :(得分:0)

而不是让卖方和卖方的买方,然后买方的Trans,如何获得卖方和卖方的Trans,然后买方&#39 ;来自每个卖方的Trans?

的信息