如何解决定义关系Ruby-on-Rails
我有一个“位置”表和一个“角色”表,
位置表:
id|location_name|location_code|category|
1 | location1 | 0001 | Urban |
2 | location2 | 0002 | Rural |
3 | location3 | 0003 |Suburban|
________________________________________
收入表:
id|role_code|rural|urban|suburban|
1 | 1001 | 5 | 10 | 15 |
2 | 1002 | 7 | 12 | 17 |
1 | 1003 | 9 | 14 | 19 |
__________________________________
位置表用于了解区域(农村,城市或郊区)的类别,角色表用于根据位置类别来了解收入的价格。
我如何将两个表连接在一起,以便每当用户放置位置和角色时,他们都能看到价格?
解决方法
当前结构本质上不是非常可扩展的。我强烈建议您更改数据的结构方式。看下面的例子。
# Instead of storing the location category in as text you can store references
# of location_category in locations & revenues table
class LocationType # Location Category
end
# +----+-----------+
# | id | name |
# +----+-----------+
# | 1 | Urban |
# +----+-----------+
# | 2 | Rural |
# +----+-----------+
# | 3 | Sub Urban |
# +----+-----------+
# Similarly instead of storing role_code,you can store references to roles
# in your revenue table
class Role
end
# +----+------+--------+
# | id | code | name |
# +----+------+--------+
# | 1 | 1001 | Role 1 |
# +----+------+--------+
# | 2 | 1002 | Role 2 |
# +----+------+--------+
# | 3 | 1003 | Role 3 |
# +----+------+--------+
class Location
belongs_to :location_type
end
# +----+-----------+---------+------------------+
# | id | name | code | location_type_id |
# +----+-----------+---------+------------------+
# | 1 | location1 | 001 | 1 |
# +----+-----------+---------+------------------+
# | 2 | location2 | 002 | 2 |
# +----+-----------+---------+------------------+
# | 3 | location3 | 003 | 3 |
# +----+-----------+---------+------------------+
class Revenue
belongs_to :location_type
belongs_to :role
end
# References for roles & location_type stored instead of actual values
# +----+-----------+---------+------------------+
# | id | role_id | revenue | location_type_id |
# +----+-----------+---------+------------------+
# | 1 | 1 | 5 | 2 |
# +----+-----------+---------+------------------+
# | 2 | 2 | 7 | 2 |
# +----+-----------+---------+------------------+
# | 3 | 3 | 9 | 2 |
# +----+-----------+---------+------------------+
# | 4 | 1 | 10 | 1 |
# +----+-----------+---------+------------------+
# | 5 | 2 | 12 | 1 |
# +----+-----------+---------+------------------+
# | 6 | 3 | 14 | 1 |
# +----+-----------+---------+------------------+
# | 7 | 1 | 15 | 3 |
# +----+-----------+---------+------------------+
# | 8 | 2 | 17 | 3 |
# +----+-----------+---------+------------------+
# | 9 | 3 | 19 | 3 |
# +----+-----------+---------+------------------+
现在,通过这种结构,您可以在数据库上运行最优查询以提取数据。
# Example
location_type_id = params[:location_type_id]
role_id = params[:role_id]
@revenue = Revenue.where({
location_type_id: location_type_id,role_id: role_id
}).sum(:revenue)
如果您还希望在“收入”表中添加location_id,则可以找到特定位置的收入,如下所示:
@revenue = Revenue.where({
role_id: role_id,location_id: location_id
}).sum(:revenue)
,
如果用户放置location2和角色1003,则可以执行以下操作:
location = params[:location] # or some other way to get the input
role = params[:role] # or some other way to get the input
location_category = Location.find_by(name: location).category.downcase
# now location_category will be rural
Reveneu.find_by(role_code: role).send(location_category)
# with the .send method you can access the column that you need(in this case rural)
,
假设用户在用户模型中具有角色代码和位置名称-
user = User.first
category = Location.find_by(name: location).category.downcase
price = Revenue.find_by(role_code: user.role_code).send(category)
puts "Your price is #{price}"
,
获取价格的一种简单方法是使一个函数接受一个Location对象(user_entered_location)和一个Revenue对象(user_entered_revenue)并返回一个价格。
def get_price(user_entered_location,user_entered_revenue)
if user_entered_location.category=="Urban"
return user_entered_revenue.urban
elsif user_entered_location.category=="Suburban"
return user_entered_revenue.suburban
else
return user_entered_revenue.rural
end
您还可以查看JSONPlaceholder
,最简单的方法是使用if
语句来检查位置是城市,乡村还是郊区。
我假设您想在其他模型中使用价格,因此我在下面的代码示例中将模型称为transaction
。
if transaction_params[:price].blank?
if @transaction.location.category == 'Rural'
@transaction.price = @transaction.revenue.rural
elsif @transaction.location.category == 'Suburban'
@transaction.price = @transaction.revenue.suburban
else
@transaction.price = @transaction.revenue.urban
end
end
您可以通过事务控制器中的create
方法执行此操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。